Zum Inhalt springen

Eleu

Mitglieder
  • Gesamte Inhalte

    939
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Eleu

  1. Eleu

    C# , FileSystemWatcher

    Ja, kann ich machen. Was mir auffällt ist, dass sich im Projekt Mappen Explorer, das Symbol der Klasse ResultWriter in eine Form Symbol ändert, sobald ich in der Klasse Form1 als Basisklasse bekannt mache. Es ist ein Testprogramm, in dem ich auch diese Klasse, über ein Interface von anderen Klassenerbt. Ich versuche das mal in einem ganz neuen Testprogramm.
  2. Eleu

    C# , FileSystemWatcher

    Guten Morgen, vor 15 – 20 Jahren habe ich größere Anwendungen, mit Visual Basic 6 geschrieben, und dann mit langer Unterbrechung, eigentlich nur noch sporadisch mal kleine Sachen. Gegenwärtig, versuche ich mich in eine sehr komplexe Anwendung, die ein Kollege von mir in C# geschrieben hat, einzuarbeiten. Um einen Einstieg hinzubekommen, habe ich mir zunächst selber kleinere Aufgaben gestellt und diese versucht mit VB.Net zu lösen. Das hat auch ganz gut geklappt, denn von der Syntax her besteht kein großer Unterschied zu VB6 und ich musste mich nur in der neuen Entwicklungsumgebung zurechtfinden. Jetzt versuche ich den Schritt in Richtung C# und, dank eurer Unterstützung, klappt das auch schon ganz gut. Parallel dazu habe ich auch ein Buch zum Nachschlagen. Man mag meine Art, so zu lernen kritisch sehen, weil bei der schrittweisen Umsetzung, einige Grundlagen von C# fehlen, die dann dabei zur Stolperfalle werden.Das wird aber mit jeder neuen Umsetzung besser und so habe ich auch mal ein Erfolgserlebnis. Jetzt wieder mit dem Hallo Welt Programm zu beginnen, wie ich es damals bei VB5 gemacht habe, wäre heute langweilig und ermüdend, weil vieles ja schon bekannt ist und dann gibt man vielleicht auf, weil es keinen Spaß macht.. Vllt. kann das der Ein oder Andere ja verstehen? Noch eine technische Frage: Wenn ich aus einer Klasse heraus in eine TextBox schreiben wollte, würde ich eine Methode dafür in der Form programmieren: public void TextAnzeigen() { textBox1.Text = "Der Text"; } Nun könnte ich ja in der Klasse einfach diese Methode aufrufen, wenn ich nun die Form1 als Basisklasse dort angebe public class ResultWriter : Form1 Die Methode ist in der Klasse dann auch aufrufbar, doch es funktioniert nicht. Ich bekomme beim Start der Anwendung diese Fehlermeldung: System.StackOverflowException: "Eine Ausnahme vom Typ "System.StackOverflowException" wurde ausgelöst." und zwar an dieser Stelle in der Form: ResultWriter b = new ResultWriter(); Danach hängt sich sogar das ganze Visual Studio auf und startet neu. Darf eine Klasse nicht von Form1 erben? Wie kann ich aus einer Klasse heraus Methoden in der Form auslösen? Gruß Eleu
  3. Eleu

    C# , FileSystemWatcher

    O.k. habe es herausgefunden: Damit geht es in der bestehenden Klasse Program: class Program { private FileSystemWatcher watcher; public Program() { this.watcher = new FileSystemWatcher(@"C:\PPS"); this.watcher.Changed += (sender, e) => MessageBox.Show("Eine Änderung"); // this.watcher.Created += (sender, e) => MessageBox.Show("Eine Änderung3"); // this.watcher.Deleted += (sender, e) => MessageBox.Show("Eine Änderung2"); this.watcher.EnableRaisingEvents = true; } /// <summary> /// Der Haupteinstiegspunkt für die Anwendung. /// </summary> [STAThread] static void Main(string[] args) { Program program = new Program(); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } Danke. Gruß Eleu
  4. Eleu

    C# , FileSystemWatcher

    Hallo zusammen, also ich kapiere es nicht. Vielleicht habe ich auch etwas ganz wesentliches noch nicht verstanden. Wenn ich eine Klasse erzeuge, oder eine Methode in der Form, dann muss ich doch in einer ereignisgesteuerten Programmiersprache, ein Ereignis nutzen (z.B.: Button Click) um einer Klasse Parameter zu übergeben. Ich bekomme dann, wenn nicht void, auch einen Rückgabewert zurück, den ich dann weiter verwenden kann. Wenn es nun kein Timer ist, der zyklisch dieses Ereignis auslöst, mit welches Ereignis sage ich denn dann dem FileSystemWatcher, das er jetzt watchen soll um mir mitzuteilen, dass eine Änderung im Verzeichnis stattgefunden hat? Ich habe einen Verdacht und zwar gibt es bei mir im Projekt schon von Anfang an die Klasse Program. Muss das da rein? Ist das eine Grundroutine die bei C# im Hintergrund automatisiert durchläuft. Wie übergebe ich und wo in der Form, die Parameter der Klasse playground oder Program? Gruß Eleu
  5. Hallo, ich möchte ein Verzeichnis dahingehend überprüfen, dass bei einer Änderung (Eine Datei wird hinzugefügt) ein Ereignis ausgelöst wird. Jetzt habe ich ein Code Beispiel in VB.NET gefunden: https://msdn.microsoft.com/de-de/library/bb979388.aspx Ich habe es in C# umprogrammiert: private void Verzeichnis() { System.IO.FileSystemWatcher fsw = new System.IO.FileSystemWatcher(); System.IO.WaitForChangedResult fswResult = new System.IO.WaitForChangedResult(); fsw.Path = "C:\\PPS"; fsw.Filter = "*.txt"; fsw.NotifyFilter = System.IO.NotifyFilters.FileName; fsw.IncludeSubdirectories = false; fswResult = fsw.WaitForChanged(System.IO.WatcherChangeTypes.Created, 20000); // Auswertung von fswResult: if (fswResult.TimedOut) { // Warten durch Timeout beendet MessageBox.Show(("In den letzten 20 Sekunden wurde keine " + "Textdatei im Verzeichnis C:\\ angelegt."), "FileSystemWatcher: Timeout"); } else { // Warten durch Eintritt des Wartekriteriums beendet MessageBox.Show(("Im Pfad " + (fsw.Path + (" wurde die Textdatei " + (fswResult.Name + " angelegt!")))), "TXT-Datei erzeugt!"); } } Ich rufe nun diese Methode alle 100ms über einen Timer auf und wenn ich eine *.TXT in das Verzeichnis "C:\\PPS" kopiere, erfolgt auch wie gewünscht darüber nach 20 Sek. eine Meldung. Nur kann ich die MessageBox, die nach 20 Sek. erscheint nicht mit O.K. bestätigen und das übrige Programm hängt sich auf. Ich vermute Mal, dass es wohl nicht so gedacht ist, dass ich die Methode zyklisch über einen Timer aufrufe, weil dem FileSystemWatcher ja auch schon eine Wartezeit übergeben wird. Das Programm muss aber in eine Methode (Objekt) und eine Methode muss von außen angestoßen werden, sonst macht eine Methode nix? Wie muss ich das machen, dass es funktioniert? Kann mir jemand helfen? Gruß Eleu
  6. Man kann halt auch mehrere Methoden, aus einer Klasse weiter vererben. Habe das mal ohne BinaryCalculation mit dem Interface ICalculation der Klasse Addition und der Klasse ResultWriter gemacht: public class Addition : ICalculation { private double left; private double right; public Addition(double left, double right) { this.left = left; this.right = right; } public double Calculate() { return (this.left + this.right); } //Eine weitere Methode die vererbt werden soll string x = "Hallo Welt"; public string WasMachen() { return x; } } public class ResultWriter { virtual public void SendToFile(ICalculation calculation) { using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\VB_net\\Test.txt", true)) { sw.WriteLine(calculation.Calculate()); File.AppendAllText("C:\\VB_net\\Test2.txt", $"{calculation.WasMachen()}{Environment.NewLine}"); } } } Aber das geht dann nur, wenn man die neue Methode über das Interface ICalculation durchreicht. public interface ICalculation { double Calculate(); string WasMachen(); } In der Datei Test.txt steht das Ergebnis der Berechnung und in der Datei Test2.txt steht dann "Hallo Welt"
  7. Ich habe es ausprobiert und es funktioniert. In der Klasse ResultWrite, bei der Methode WriteResulttoFile muss dann folgendes stehen: public void WriteResultToFile(ICalculation calculation) { File.AppendAllText(_file, $"{calculation.ToString()}{Environment.NewLine}"); }
  8. Ich habe es noch mal wegen dem Single-Responsibility-Prinzip geändert und zwei Klassen daraus gemacht: public class In_Datei_schreiben_neu { private string _file; public In_Datei_schreiben_neu(string path) { _file = path; } public void WriteToFile(string w) { File.AppendAllText(_file, $"{w}{ Environment.NewLine}"); } } class Ergebnis_String2 { public double Operand { get; set; } public double Operand1 { get; set; } public double Ergebnis { get; set; } public override string ToString() { return "Berechnung: " + Operand + " + " + Operand1 + " = " + Ergebnis; } } In der Form: private void button8_Click(object sender, EventArgs e) { double Wert1 = 24; double Wert2 = 25; Ergebnis_String2 Per = new Ergebnis_String2(); Addition Addi = new Addition(Wert1, Wert2); In_Datei_schreiben_neu SP = new In_Datei_schreiben_neu("C:\\C_Sharp\\Test4.txt"); Per.Operand = Wert1; Per.Operand1 = Wert2; Per.Ergebnis = Addi.Calculate(); SP.WriteToFile(Per.ToString()); } Schönes W.E. Gruß Eleu
  9. Habe das mal versucht: Klasse: class Ergebnis_String { public double Operand { get; set; } public double Operand1 { get; set; } public double Ergebnis { get; set; } string _file = "C:\\C_Sharp\\Test.txt"; public override string ToString() { return "Berechnung: " + Operand + " + " + Operand1 + " = " + Ergebnis; } public void String_in_Datei_schreiben() { File.AppendAllText(_file, $"{ToString()}{Environment.NewLine}"); } } In der Form: private void button7_Click(object sender, EventArgs e) { double Wert1 = 24; double Wert2 = 25; Ergebnis_String Per = new Ergebnis_String(); Addition Addi = new Addition(Wert1, Wert2); Per.Operand = Wert1; Per.Operand1 = Wert2; Per.Ergebnis = Addi.Calculate(); Per.String_in_Datei_schreiben(); } Dann steht in der Datei: Berechnung: 24 + 25 = 49
  10. Hallo alergermi, es funktioniert soweit. Danke für das Beispiel Es muss aber noch ein override zwischen public und string. public override string GetRepresentation() { return $"Addition: ({_firstOperand} + {_secondOperand})"; }
  11. Ich denke, du musst es so sehen (1+2)*13+4 Es wird Anweisung für Anweisung verarbeitet.
  12. private void button6_Click(object sender, EventArgs e) { double x = new Addition(1, 2).Calculate(); double y = new Multiplikation(x, 13).Calculate(); double result = new Addition(y, 4).Calculate(); MessageBox.Show(Convert.ToString(result)); } Ja, mit deinem Beispiel ist es für mich verständlicher..
  13. Hallo, ich kann euch jetzt nicht mehr so ganz folgen, aber das ist nicht so schlimm. Ich schau mir das noch mal in Ruhe an. Interessant finde ich jedenfalls, dass ich damit auch meine Multiplikations-Klasse mit der Additions-Klasse verketten kann: private void button5_Click(object sender, EventArgs e) { Addition s = new Addition(new Multiplikation(new Addition(1, 2).Calculate(), 13).Calculate(), 4); MessageBox.Show(Convert.ToString(s.Calculate())) } Die Message Box zeigt mir 43 als Ergebnis an
  14. Es funktioniert, aber ich habe noch nicht ganz kapiert wie das gehen kann? Was müsste ich denn programmieren, wenn ich noch eine weitere 4te Zahl addieren möchte?
  15. Hallo arlegermie, vielen dank ich probiere das mal aus. Ich hoffe ich nerve nicht, denn ich hätte noch ein paar Fragen, bzgl. der prinzipiellen Vorgehensweise, bei der Klassenprogrammierung mit Vererbung. Ich habe jetzt folgende Klassen und ein Interface programmiert: { public interface ICalculation { double Calculate(); } public abstract class BinaryCalculation : ICalculation { protected double _firstOperand; protected double _secondOperand; public BinaryCalculation(double a, double b) { _firstOperand = a; _secondOperand = b; } public abstract double Calculate(); } public class Addition : BinaryCalculation { public Addition(double a, double b) : base(a, b) { } public override double Calculate() => _firstOperand + _secondOperand; } public class Multiplikation : BinaryCalculation { public Multiplikation(double a, double b) : base(a, b) { } public override double Calculate() => _firstOperand * _secondOperand; } public class ResultWriter { private string _file; public ResultWriter(string path) { _file = path; // Dateipfad und Dateiname werden der Variablen _file übergeben } public void WriteResultToFile(ICalculation calculation) //Vereerbung über das Interface ICalculation { File.AppendAllText(_file, $"{calculation.GetType()} result: {calculation.Calculate()}{Environment.NewLine}"); } } } Nun möchte ich eine Klasse programmieren, die 3 Variable addieren soll. Wenn ich es nun richtig verstanden habe, müsste ich nun eine neue Klasse Addieren2 programmieren, mit einer Methode Calculate2, sowie ein weitere abstrakte Klasse BinaryCalculation2, um nicht gegen das Single-Responsibility-Prinzip zu verstoßen. Soll ich dann im Interface ICalculation diese Methode Calculate2 einfügen, oder soll ich ein neues Interface ICalculation2 hinzufügen? Oder kann ich die Calculate auch für Addition2 verwenden? Sahe dann so aus: public abstract class BinaryCalculation2 : ICalculation { protected double _firstOperand; protected double _secondOperand; protectet double _thirdOperand; public BinaryCalculation2(double a, double b, double c) { _firstOperand = a; _secondOperand = b; _thirdOperand = c; } public abstract double Calculate(); } public class Addition2 : BinaryCalculation2 { public Addition(double a, double b, double c) : base(a, b, c) { } public override double Calculate() => _firstOperand + _secondOperand + _thirdOperand; } Ist das die richtige Vorgehensweise? Edit: Letztgenannte Variante funktioniert jedenfalls.
  16. Ich denke, da muss ich mir noch so einiges anschauen
  17. System.IO.File liefert mir aber keine Methode, um zeilenweise in die Datei zu schreiben. Es fehlt die Methode WriteLine. Oder was müsste ich ändern, damit zeilenweise hineingeschrieben wird? File.AppendAllText(_file, $"{calculation.GetType()} result: {calculation.Calculate()}");
  18. Vielen Dank noch mal an alle Es geht auch so etwas: public class ResultWriter { virtual public void SendToFile(ICalculation calculation) { using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\VB_net\\Test.txt", true)) { sw.WriteLine(calculation.Calculate()); } } } Aber die anderen Varianten sind sehr interessant. Gruß Eleu
  19. Hallo r4phi, ich habe jetzt folgendes gemacht: public void WriteResultToFile(ICalculation calculation) { File.AppendAllText(_file, $"{calculation.GetType()} result: {calculation.Calculate()}"); } Du hast recht, die Zeile ist nach dem Einfügen des $ Zeichen nicht mehr rot, aber wenn ich den Button ausführe steht in der Textdatei: Klassenprogrammierung_in_C_Sharp.Addition result: 9 Edit: Ach so, das soll auch dabei rauskommen?
  20. Hi, ich verwende Visual Studio 2015, allerdings die kostenlose Variante, die man hier downloaden kann: https://www.microsoft.com/germany/techwiese/aktionen/visual-studio-kostenlos.aspx Ich habe das mal ersetzt und damit klappt es jetzt. In der Datei steht nun result: 9 Vielen Dank. Gruß Eleu
  21. Hi, das habe ich schon versucht. Z.B: Speichern.WriteResultToFile(new Addition(4,5)); Aber wenn ich dann den Button ausführe, steht in der Textdatei folgender Eintrag: {calculation.GetType()} result: {calculation.Calculate()}
  22. Hallo alergermi, vielen Dank dafür, aber leider klappt es nicht bei mir. Wahrscheinlich sind meine C# Kenntnisse nicht ausreichend? In der Zeile File.AppendAllText($"{calculation.GetType()} result: {calculation.Calculate()}"); bekomme ich bei AppendAllText die Fehlermeldung: Keine Überladung für die AppendAllText Methode nimmt 1 Argument ein. Des Weiteren weiß ich nicht, wie ich in dem Button für die Berechnung nun WriteResultToFile programmieren muss? ResultWriter Speichern = new ResultWriter("C:\\VB_net\\Test.txt"); Speichern.WriteResultToFile(Was muss hier rein? Erwartet wird ICalculation calculation); Gruß Eleu
  23. Hallo Whiz-zarD, vielen Dank. Mittlerweile habe ich mir meine Ausgangsfrage aus diesem Thread selber beantworten können: Klasse für das Addieren: { public class Addition { private double left; private double right; public Addition(double left, double right) { this.left = left; this.right = right; } public double Calculate() { return (this.left + this.right); } } } Übergabe der Parameter in der Form: { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Addition Addi = new Addition(2, 5); double s = Addi.Calculate(); textBox1.Text = Convert.ToString(s); } } } Aber wie müsste dann eine Basisklasse (Interface) und die Klasse Ergebnisse_speichern aussehen, damit man das Ergebnis in eine Textdatei bekommt? Gruß Eleu
  24. Hallo, vielleicht doch noch eine Frage. Warum brauche ich die Klasse "BinaryCalculation" Wenn ich z.B. die Klasse Addition so umprogrammiere, kann ich die Klasse "BinaryCalculation" löschen: Public Class Addition Inherits ICalculation Private ReadOnly calculation As ICalculation Private ReadOnly left As Double Private ReadOnly right As Double Public Sub New(calculation As ICalculation) Me.calculation = calculation End Sub Public Sub New(left As Double, right As Double) Me.left = left Me.right = right End Sub Public Overrides Function Calculate() As Double Return Me.left + Me.right End Function End Class Gruß Eleu

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...