AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein C# Eigenes Ereignis für eine Klasse
Thema durchsuchen
Ansicht
Themen-Optionen

C# Eigenes Ereignis für eine Klasse

Ein Thema von Luckie · begonnen am 15. Mär 2005 · letzter Beitrag vom 21. Mär 2005
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

C# Eigenes Ereignis für eine Klasse

  Alt 15. Mär 2005, 15:27
Ich habe folgende Klasse zum Splitten einer Datei:
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);
     }


     public void 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;
                  }
               }
               while (BytesToRead > 0);
               pf.Close();
            }
            catch (Exception e)
            {
               fts.Close();
               throw new FSException(e.Message);                  
               
            }
         }
         fts.Close();
      }
      catch (Exception e)
      {
         throw new FSException(e.Message);
      }
     }
   }
Der würde ich jetzt gerne ein eigenes Ereigniss verpassen, damit ich den Fortschritt anzeigen kann. Ich habe allerdings keinen Plan, wie ich das mache. Das heißt, ich weiß weder, wie ich das Ereigniss in die Klasse bekomme, noch wie ich es dann in der WinForm Klasse einbinde.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#2

Re: C# Eigenes Ereiegnis für eine Klasse

  Alt 15. Mär 2005, 15:47
Du hast doch sicher das deutsche .NET-Framework SDK? Dann schau mal bitte unter folgendem Link rein:
Code:
ms-help://MS.NETFrameworkSDKv1.1.DE/cpguidenf/html/cpconprovidingeventfunctionality.htm
Da wird gezeigt, wie man ein eigenes Ereignis mit eigenen Werten usw. erzeugt und auslöst. Ich habe ein ähnliches Prinzip (wenn auch einfacher) bei meinem Help 2.0-Dienst benutzt. Wenn du bspw. die Auswahl der Filter-Combobox im Inhaltsverzeichnis änderst, dann sollen das die Pads für den Index und die Suche mitkriegen und ihre Comboboxen entsprechend anpassen. Und dazu habe ich auch ein Ereignis benutzt. Allerdings brauchte ich keine speziellen Werte. Du allerdings schon, denn ich vermute, du willst den Progressstatus an- bzw. übergeben.

Bei mir sieht´s halt so aus:
Code:
public string FindFilterQuery(string filterName)
{
   if(String.Compare(filterName,currentSelectedFilterName) != 0)
   {
      currentSelectedFilterName = filterName;

      // Ereignis auslösen
      OnFilterQueryChanged(EventArgs.Empty);
   }

   // ... anderer Code ...
}

public event EventHandler FilterQueryChanged;

protected virtual void OnFilterQueryChanged(EventArgs e)
{
   if(FilterQueryChanged != null) {
      FilterQueryChanged(this, e);
   }
}
Du müsstest dein Ereignis an dem Punkt auslösen/aufrufen, an dem sich die Bearbeitung der Datei in irgendeiner Form ändert. Ich denke, irgendwo hier:
Code:
pf.Write(ByteArray, 0, BytesRead);

PS: Das Benutzen habe ich wieder vergessen. Ist auch ganz einfach. Da das Ereignis von meinem Dienst zur Verfügung gestellt wird, schreibe ich eine Zuweisung:
Code:
// h2env ist meine Dienstklasse "HtmlHelp2Environment"
h2env.FilterQueryChanged += new EventHandler(OnFilterQueryChanged);
und die passende Funktion
Code:
private void OnFilterQueryChanged(object sender, EventArgs e)
{
   mainPanel.Refresh();
   filterCombobox.SelectedIndex = filterCombobox.Items.IndexOf(h2env.CurrentFilterName);
}
und das war´s. Das wäre jetzt ein Auszug aus dem Suchpad; sprich: einer eigenen Klasse (bei dir mit deinem WinForms-Teil vergleichbar).
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: C# Eigenes Ereiegnis für eine Klasse

  Alt 15. Mär 2005, 16:15
Danke ich werde es mir mal angucken. Aber nicht mehr jetzt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: C# Eigenes Ereiegnis für eine Klasse

  Alt 16. Mär 2005, 15:33
Puh. So weit habe ich es geschafft:
Code:
public event EventHandler Progress;
protected void OnProgress(EventArgs e, long Done)
{   
   if(Progress != null)
   {
        //???      
   }
}
Done hat hier schon den ruichtigen Wert. Nur wie bekomme ich den nach private void OnProgress(object sender, EventArgs e) von WinForm?

Das steht in meiner Klasse drinne. So sieht der Aufruf beim teilen aus:
Code:
if (Done != OldDone)
{
   OldDone = Done;
   OnProgress(EventArgs.Empty, Done);
}
So die Zuweisung beim Erstellen des Objektes un der neue EventHandler:
Code:
private void OnProgress(object sender, EventArgs e)
{
   //progressBar1.Value =
   Application.DoEvents;
}
Ich habe gerade gemerkt, wenn ich hier eine Messaagbox einbaue, dann wird die gar nicht aufgerufen.
Code:
private void btnGo_Click(object sender, System.EventArgs e)
{
   FileSplitter fs;
   try
   {
      fs = new FileSplitter();
      fs.Progress += new EventHandler(OnProgress);
      fs.Split(txtFile.Text, txtFolder.Text,
        Convert.ToInt32(lblCntFiles.Text),
        Convert.ToInt32(txtFileSize.Text));
   }
   catch(FSException fse)
   {   
      MessageBox.Show(fse.Message, APPNAME, MessageBoxButtons.OK, MessageBoxIcon.Error);
   }
}
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: C# Eigenes Ereignis für eine Klasse

  Alt 19. Mär 2005, 11:23
Ich darf es noch mal nach oben holen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Generalissimo

Registriert seit: 28. Aug 2003
187 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: C# Eigenes Ereignis für eine Klasse

  Alt 19. Mär 2005, 12:41
Ich denke so ohne weiteres wird das nicht gehen.
Vielleicht hilft dir das ja weiter

C# Galileo Open Book Kapitel 23 Ereignisse
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: C# Eigenes Ereignis für eine Klasse

  Alt 19. Mär 2005, 16:44
Also so kompliziert kann das doch nicht seim. Und ich kann mir nicht vorstellen, dass das noch niemand gemacht hat. Mit der VCL geht das ja auch ohne Probleme.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#8

Re: C# Eigenes Ereignis für eine Klasse

  Alt 19. Mär 2005, 19:29
Ich hatte dir eigentlich den Link ins Framework-SDK gegeben. Dort wird am Beispiel eines Weckers gezeigt, wie das Ereignis eigene Daten bzw. Werte an die Anwendung weiterreicht und wie diese dort abgefragt werden.
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#9

Re: C# Eigenes Ereignis für eine Klasse

  Alt 19. Mär 2005, 20:23
Wenn ihm der Bleistift aus der SDK Doku nicht zusagt, muss er sich eben mein wirres Beispiel antun.
Code:
/*
 * Created by SharpDevelop.
 * User: Robert
 * Date: 19.03.2005
 * Time: 20:11 PM
 */
using System;

namespace DelphiPRAXIS.Samples.EventsFürHerrnPuff // ;-)
{
   public class EventTest
   {
      /// <summary>
      /// <see cref="EventArgs"/>ableitung, die einen String hält.
      /// </summary>
      public class MyEventArgs :EventArgs
      {
         string someString;
         
         public string SomeString
         {
            get   {return someString;}
            set {someString = value;}
         }
         
         public MyEventArgs(string someString)
         {
            this.someString = someString;
         }
      }
      
      /// <summary>
      /// Los <see cref="Delegate">Delegatos</see>...
      /// </summary>
      public delegate void SampleEventHandler(object sender, MyEventArgs e);
      
      /// <summary>
      /// Der zu <see cref="EventTest.SampleEventHandler">SampleEventHandler<see/> gehörende <see cref="Event"/>
      /// </summary>
      /// <param name="e">siehe <see cref="EventTest.MyEventArgs">MyEventArgs</see></param>
      public event SampleEventHandler SampleEvent;
      
      /// <summary>
      /// Die Methode, die <see cref="EventTest.SampleEvent">SampleEvent<see/> feuert.
      /// </summary>
      protected virtual void OnSampleEvent(MyEventArgs e)
      {
         if (SampleEvent != null)
         {
            SampleEvent(this, e);
         }
      }
      
      /// <summary>
      /// Eine simple Beispielmethode.
      /// <remarks>Sie wird eigentlich "Hallo" in die Kommmandozeile ausspucken.
      /// dieser Wert kann aber durch den <see cref="EventTest.SampleEvent">SampleEvent<see/> abgefangen und verändert werden.</remarks>
      /// </summary>
      public void DoSomething()
      {
         MyEventArgs eventArgs = new MyEventArgs("Hallo");
         
         OnSampleEvent(eventArgs);
         
         Console.WriteLine(eventArgs.SomeString);
      }
   }
   
   class Program
   {
      
      void SampleEventCall(object sender, EventTest.MyEventArgs e)
      {
         e.SomeString = "Möööp";
      }
      
      
      public void RunSample()
      {
         EventTest eventTest = new EventTest();
         eventTest.SampleEvent += new EventTest.SampleEventHandler(SampleEventCall);
         
         eventTest.DoSomething();
         
      }
      
      
      public static void Main(string[] args)
      {
         Program program = new Program();
         program.RunSample();
      }
   }
}
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: C# Eigenes Ereignis für eine Klasse

  Alt 19. Mär 2005, 20:38
Zitat von MathiasSimmack:
Ich hatte dir eigentlich den Link ins Framework-SDK gegeben. Dort wird am Beispiel eines Weckers gezeigt, wie das Ereignis eigene Daten bzw. Werte an die Anwendung weiterreicht und wie diese dort abgefragt werden.
Ach so, der ließ sich nicht aufrufen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz