Hallo,
ich bin Anfänger und habe eine Frage, die wahrscheinlich manche zum Lachen bringt.
In meinem Quellcode habe ich eine Foreach-Schleife.
Diese soll alle 15 Sekunden ausgeführt werden so lange das Programm offen ist.
Es handelt sich um eine Windows-Anwendung bei der eun Notification Icon im Systray zu sehen ist, sonst nichts.
Den Code Schnippsel habe ich von hier: https://dotnet-snippets.de/snippet/v...-anwendung/541
und hier ist der Code:
/*
* Erstellt mit SharpDevelop.
* Datum: 02.09.2019
* Zeit: 13:24
*
* Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern.
*/
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Drawing;
namespace Zuarbeit
{
/// <summary>
/// Class with program entry point.
/// </summary>
internal sealed class Program
{
/// <summary>
/// Program entry point.
/// </summary>
//*****************************************************************************
static class MyNotifyIconApplication
{
private static NotifyIcon notico;
//==========================================================================
public static void Main (string [] astrArg)
{
string fileName = "";
string sourcePath = @"Z:\DHL\";
string targetPath = @"Z:\DHL\Versand\";
// hier werden die Pfade angegeben
string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
string destFile = System.IO.Path.Combine(targetPath, fileName);
foreach (var fn in Directory.GetFiles(@"Z:\DHL", "*.txt")) {
// Eine Backupdatei von der Quelldatei anlegen
fileName = System.IO.Path.GetFileNameWithoutExtension(fn);
destFile = System.IO.Path.Combine(sourcePath, fileName+".bak");
System.IO.File.Copy(fn, destFile, true);
// in der Textdatei alle # mit | ersetzen.
string text = File.ReadAllText(fn);
text = text.Replace("#", "|");
File.WriteAllText(fn, text);
// die Datei in den Zielordner kopieren und danach löschen - hier könnte wohl auch gleich verschoben werden ^^
fileName = System.IO.Path.GetFileName(fn);
destFile = System.IO.Path.Combine(targetPath, fileName);
System.IO.File.Copy(fn, destFile, true);
System.IO.File.Delete(fn);
}
ContextMenu cm;
MenuItem miCurr;
int iIndex = 0;
// Kontextmenü erzeugen
cm = new ContextMenu ();
// Kontextmenüeinträge erzeugen
miCurr = new MenuItem ();
miCurr.Index = iIndex++;
miCurr.Text = "&Aktion 1"; // Eigenen Text einsetzen
miCurr.Click += new System.EventHandler (Action1Click);
cm.MenuItems.Add (miCurr);
// Kontextmenüeinträge erzeugen
miCurr = new MenuItem ();
miCurr.Index = iIndex++;
miCurr.Text = "&Beenden";
miCurr.Click += new System.EventHandler (ExitClick);
cm.MenuItems.Add (miCurr);
// NotifyIcon selbst erzeugen
notico = new NotifyIcon ();
notico.Icon = new Icon("smile.ico"); // Eigenes Icon einsetzen
notico.Text = "Doppelklick mich!"; // Eigenen Text einsetzen
notico.Visible = true;
notico.ContextMenu = cm;
notico.DoubleClick += new EventHandler (NotifyIconDoubleClick);
// Ohne Appplication.Run geht es nicht
Application.Run ();
}
//==========================================================================
private static void ExitClick (Object sender, EventArgs e)
{
notico.Dispose ();
Application.Exit ();
}
//==========================================================================
private static void Action1Click (Object sender, EventArgs e)
{
// nur als Beispiel:
// new MyForm ().Show ();
}
//==========================================================================
private static void NotifyIconDoubleClick (Object sender, EventArgs e)
{
// Was immer du willst
}
}
}
}
Danke 😁
Im einfachsten Fall empfehle ich dir die Verwendung eines Timers.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Hmm,
das hab ich mir auch schon überlegt und hab per Google einiges zusammengesucht und probiert. Doch leider erhalte ich mit diesem Code:
/*
* Erstellt mit SharpDevelop.
* Benutzer: Rettig
* Datum: 02.09.2019
* Zeit: 13:24
*
* Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern.
*/
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Drawing;
using System.Timers;
namespace Zuarbeit
{
/// <summary>
/// Class with program entry point.
/// </summary>
internal sealed class Program
{
/// <summary>
/// Program entry point.
/// </summary>
//*****************************************************************************
static class MyNotifyIconApplication
{
private static NotifyIcon notico;
//==========================================================================
public static void Main (string [] astrArg)
{
Timer t1 = new Timer(); // Timer anlegen
t1.Interval = 100; // Intervall festlegen, hier 100 ms
t1.Tick+=new EventHandler(t1_Tick); // Eventhandler ezeugen der beim Timerablauf aufgerufen wird
t1.Start(); // Timer starten
string fileName = "";
string sourcePath = @"Z:\DHL\";
string targetPath = @"Z:\DHL\Versand\";
// Use Path class to manipulate file and directory paths.
string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
string destFile = System.IO.Path.Combine(targetPath, fileName);
void t1_Tick(object sender, EventArgs e)
{
foreach (var fn in Directory.GetFiles(@"Z:\DHL", "*.txt")) {
// Eine Backupdatei von der Quelldatei anlegen
fileName = System.IO.Path.GetFileNameWithoutExtension(fn);
destFile = System.IO.Path.Combine(sourcePath, fileName+".bak");
System.IO.File.Copy(fn, destFile, true);
// in der Textdatei alle # mit | ersetzen.
string text = File.ReadAllText(fn);
text = text.Replace("#", "|");
File.WriteAllText(fn, text);
// die Datei in den Zielordner kopieren und danach löschen
fileName = System.IO.Path.GetFileName(fn);
destFile = System.IO.Path.Combine(targetPath, fileName);
System.IO.File.Copy(fn, destFile, true);
System.IO.File.Delete(fn);
MessageBox("nochmal");
}
}
ContextMenu cm;
MenuItem miCurr;
int iIndex = 0;
// Kontextmenü erzeugen
cm = new ContextMenu ();
// Kontextmenüeinträge erzeugen
miCurr = new MenuItem ();
miCurr.Index = iIndex++;
miCurr.Text = "&Aktion 1"; // Eigenen Text einsetzen
miCurr.Click += new System.EventHandler (Action1Click);
cm.MenuItems.Add (miCurr);
// Kontextmenüeinträge erzeugen
miCurr = new MenuItem ();
miCurr.Index = iIndex++;
miCurr.Text = "&Beenden";
miCurr.Click += new System.EventHandler (ExitClick);
cm.MenuItems.Add (miCurr);
// NotifyIcon selbst erzeugen
notico = new NotifyIcon ();
notico.Icon = new Icon("smile.ico"); // Eigenes Icon einsetzen
notico.Text = "Doppelklick mich!"; // Eigenen Text einsetzen
notico.Visible = true;
notico.ContextMenu = cm;
notico.DoubleClick += new EventHandler (NotifyIconDoubleClick);
// Ohne Appplication.Run geht es nicht
Application.Run ();
}
//==========================================================================
private static void ExitClick (Object sender, EventArgs e)
{
notico.Dispose ();
Application.Exit ();
}
//==========================================================================
private static void Action1Click (Object sender, EventArgs e)
{
// nur als Beispiel:
// new MyForm ().Show ();
}
//==========================================================================
private static void NotifyIconDoubleClick (Object sender, EventArgs e)
{
// Was immer du willst
}
}
}
}
nur Fehlermeldungen. Ich denke es liegt an der falschen Position des Timers, aber ich weiß nicht wo er hin muß. Kann mir jemand dabei helfen?
Wie gesagt, bin absoluter Neuling und versuche "learning by doing" =)
Was erhältst du denn für Fehler? Nur "Ich erhalte Fehler" ist für keinen hilfreich.
Da ich es mir aber dennoch mal angesehen habe. Dein Code kann so halt einfach garnicht kompilieren. Du hast den Eventhandler t1_Tick mitten in die Main Methode gepackt.
Eigne dir am besten wenigstens die nötigsten Grundlagen an.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Ich erhalte insgesamt 37 Fehler, die ich nicht alle aufführen kann.
Dein Code kann so halt einfach garnicht kompilieren. Du hast den Eventhandler t1_Tick mitten in die Main Methode gepackt.
Könntest Du mir sagen wo das dann hinmuß und warum?
Ich weiß das es ohne Grundlagen nicht geht und es ist wohl auch ein Fehler gleich mit c# anzufangen wenn man noch nie programmiert hat. doch leider stehe ich unter Zeitdruck und habe nicht soviel Zeit 🙁
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Drawing;
namespace Zuarbeit
{
/// <summary>
/// Class with program entry point.
/// </summary>
internal sealed class Program
{
/// <summary>
/// Program entry point.
/// </summary>
//*****************************************************************************
void t1_Tick(object sender, EventArgs e)
{
string fileName = "";
string sourcePath = @"Z:\DHL\";
string targetPath = @"Z:\DHL\Versand\";
// Use Path class to manipulate file and directory paths.
string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
string destFile = System.IO.Path.Combine(targetPath, fileName);
foreach (var fn in Directory.GetFiles(@"Z:\DHL", "*.txt")) {
// Eine Backupdatei von der Quelldatei anlegen
fileName = System.IO.Path.GetFileNameWithoutExtension(fn);
destFile = System.IO.Path.Combine(sourcePath, fileName+".bak");
System.IO.File.Copy(fn, destFile, true);
// in der Textdatei alle # mit | ersetzen.
string text = File.ReadAllText(fn);
text = text.Replace("#", "|");
File.WriteAllText(fn, text);
// die Datei in den Zielordner kopieren und danach löschen
fileName = System.IO.Path.GetFileName(fn);
destFile = System.IO.Path.Combine(targetPath, fileName);
System.IO.File.Copy(fn, destFile, true);
System.IO.File.Delete(fn);
}
}
static class MyNotifyIconApplication
{
private static NotifyIcon notico;
//==========================================================================
public static void Main (string [] astrArg)
{
Timer t1 = new Timer(); // Timer anlegen
t1.Interval = 100; // Intervall festlegen, hier 100 ms
t1.Tick+=new EventHandler(t1_Tick); // Eventhandler ezeugen der beim Timerablauf aufgerufen wird
t1.Start(); // Timer starten
ContextMenu cm;
MenuItem miCurr;
int iIndex = 0;
// Kontextmenü erzeugen
cm = new ContextMenu ();
// Kontextmenüeinträge erzeugen
miCurr = new MenuItem ();
miCurr.Index = iIndex++;
miCurr.Text = "&Aktion 1"; // Eigenen Text einsetzen
miCurr.Click += new System.EventHandler (Action1Click);
cm.MenuItems.Add (miCurr);
// Kontextmenüeinträge erzeugen
miCurr = new MenuItem ();
miCurr.Index = iIndex++;
miCurr.Text = "&Beenden";
miCurr.Click += new System.EventHandler (ExitClick);
cm.MenuItems.Add (miCurr);
// NotifyIcon selbst erzeugen
notico = new NotifyIcon ();
notico.Icon = new Icon("smile.ico"); // Eigenes Icon einsetzen
notico.Text = "Doppelklick mich!"; // Eigenen Text einsetzen
notico.Visible = true;
notico.ContextMenu = cm;
notico.DoubleClick += new EventHandler (NotifyIconDoubleClick);
// Ohne Appplication.Run geht es nicht
Application.Run ();
}
//==========================================================================
private static void ExitClick (Object sender, EventArgs e)
{
notico.Dispose ();
Application.Exit ();
}
//==========================================================================
private static void Action1Click (Object sender, EventArgs e)
{
// nur als Beispiel:
// new MyForm ().Show ();
}
//==========================================================================
private static void NotifyIconDoubleClick (Object sender, EventArgs e)
{
// Was immer du willst
}
}
}
}
So bekomme ich die Fehlermeldung:
Für das nicht statische Feld, die Methode oder die Eigenschaft 'Zuarbeit.Program.t1_Tick(object, System.EventArgs)' ist ein Objektverweis erforderlich. (CS0120) - \SharpDevelop Projects\Zuarbeit\Zuarbeit\Program.cs:76,13
Hallo,
es ist absolut nichts falsch da dran direkt mit C# anzufangen. Man sollte sich allerdings anschauen, was man fabriziert und sofern Fehlermeldungen erscheinen auch mal selbst danach suchen.
Übrigens, du brauchst nicht ständig den Code der ganzen Program.cs hier posten. Der für den Fehler relevante Inhalt sollte ausreichen (wäre in dem Fall der EventHandler für Timer.Tick und die Main.
Warum der Eventhandler nun plötzlich Teil von der Klasse Programm und nicht mehr von der Klasse MyNotifyIconApplication ist erschließt sich mir ebenfalls nicht.
Vorschlag: Schieb den EventHandler zurück nach MyNotifyIconApplication und dann schau dir mal ganz genau die anderen EventHandler an.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Es sieht jetzt so aus und funktioniert:
static class MyNotifyIconApplication
{
private static void t1_Tick(object sender, EventArgs e)
{
string fileName = "";
...
string destFile = System.IO.Path.Combine(targetPath, fileName);
foreach (var fn in Directory.GetFiles(@"Z:\DHL", "*.txt")) {
...
}
}
private static NotifyIcon notico;
//==========================================================================
public static void Main (string [] astrArg)
{
Timer t1 = new Timer(); // Timer anlegen
t1.Interval = 10000; // Intervall festlegen, hier 100 ms
t1.Tick+=new EventHandler(t1_Tick); // Eventhandler ezeugen der beim Timerablauf aufgerufen wird
t1.Start(); // Timer starten
...
Ich hab die anderen Eventhandler angesehen, da stand immer private static ... auch hingeschrieben und es geht. Warum?
Nun das liegt daran, dass alle Methoden und Eventhandler die aus einer statischen Methode heraus aufgerufen werden auch statisch sein müssen.
Das ist leider schon für die Main-Methode Zwangsläufig der Fall. In der Regel ist es sowieso besser, Funktionalitäten in eine eigene Klasse auszulagern nicht statisch auszuführen.
Sofern du dich weitergehend mit der Programmierung beschäftigen möchtest, solltest du dich daher erst einmal besser einlesen.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Als nächsten Schritt wollte ich eine Konfiguratiosdatei benutzen. Der Nutzer soll den Quell- und Zielpfad selbst bestimmen können... ist das zu hoch für mich und Utopie?
Oder zeigt mir jemand wie es geht?
Das Formular dazu hab ich schon entsprechend erstellt...
Unzählige Tutorials (und jedes Anfängerbuch) zeigen Dir wie das geht:
https://www.codeproject.com/Articles/17659/How-To-Use-the-Settings-Class-in-C
http://openbook.rheinwerk-verlag.de/visual_csharp_2010/visual_csharp_2010_15_003.htm#mj8d0d17d2198f2ee0c46fb59f65e85b07
Hallo,
siehe auch [Tutorial] Konfigurationsmodell im .NET Framework
und beachte zukünftig [Hinweis] Wie poste ich richtig? Punkt 1.2
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Danke für die Links. Werd ich mich mal einlesen =)
@MarsStein:
Sorry, wenn ich weitere Fragen habe öfnne ich einen neuen Thread