datei nach tick-event schließen

der_Brain

Grünschnabel
also ich hab da ein problem
ich installiere einen timer
Code:
case "1":
		timer2		    = new Timer();
							
		timer2.Tick     += new EventHandler(Timer2OnTick);
		timer2.Interval  = 60* 1000;
		timer2.Start();
		break;
der timer ist abhängig von der zeit die der user in zwei comboBox wählen kann
danach verberge ich die HauptForm und rufe LogFileWriter auf

Code:
               // HauptForm verbergen
		this.Hide();

		// void LogFileWriter aufrufen
		LogFileWriter();

in der void schreib ich eine datei in der alle zehntel sek. die mousekoordinaten geschrieben werden.
mein prob ist nun das ich die datei erst schließen will wenn der timer getickt hat.
aber ich bekomme es noch hin der void klar zu machen wann das ist...

hier mal mein tick-ereignis:
Code:
private void Timer2OnTick(object obj, EventArgs ea)
	{
		timer2.Stop();
		timer2.Tick -= new EventHandler(Timer2OnTick);
		
		// anzeigen der HauptForm
		this.Show();
	}
hab schon versucht hier eine variable vom typ bool einzustellen, aber das hat er dann in der void LogFileWriter nicht erkannt wenn sie auf true gesetzt wurde...

hier mal die void LogFileWriter:
Code:
StreamWriter sw = new StreamWriter(Programmname+ ".txt");
//...
// wenn Mouse- Events geloggt werden sollen
		if (chkbox1.Checked)
		{
			sw.WriteLine("Mouse_Events= true");

			// Timer installieren bei dessen Tick-Event die MousePosition Eigenschaft 
			// in die log- Datei eingetragen werden
			timer3          = new Timer();
			
			timer3.Tick    += new EventHandler(Timer3OnTick);
			timer3.Interval = 100;
			timer3.Start();
		}
		else
		{
			sw.WriteLine("Mouse_Events= false");
		}
//...
sw.Close();

und nun das tick-ereignis dazu:
Code:
void Timer3OnTick(object obj, EventArgs ea)
	{
		mouseX= Cursor.Position.X;
		mouseY= Cursor.Position.Y;

		arrlstPts.Add(new Point(mouseX, mouseY));

		StreamWriter sw2 = new StreamWriter("Points.txt");
		sw2.AutoFlush = true;
		
		for (int i= 0; i<arrlstPts.Count; i++)
		{
			sw2.WriteLine(arrlstPts[i]);
		}
		
		sw2.Close();
	}
hab jetzt hier eine neue datei erzeugt, was ich eigentlich nicht will, aber er erkannte sw (streamwriter) nicht mehr.
diese void ja auch so weit, aber ich möchte eben das sie so lange offen bleibt wie der user die zeit eingestellt hat, und wenn es geht wüde ich die cursor-position in die log datei schreiben und nich eine zusätzliche datei erzeugen müssen.

kann mir da jemand helfen?
 
Hallo.

Du hast dein Problem zwar ausführlich beschrieben, aber nimm dir bitte beim nächsten Mal ein wenig mehr Zeit, um den Beitrag besser zu strukturieren, und um auf die Rechtschreibung zu achten.

Warum machst du es nicht so.
(Ich hab die Methoden etc. in eine Dummy-Klasse gegeben, damit du besser siehst wo ich z.b. den StreamWriter deklariere.. Ist natürlich nicht funktionsfähiger Code)
Code:
// usings ..

class Blubb
{
	StreamWriter sw;

	public Blubb()
	{
		timer2		    = new Timer();							
		timer2.Tick     += new EventHandler(Timer2OnTick);
		timer2.Interval  = 60* 1000;
		timer2.Start();

		LogFileWriter();
	}

	private void LogFileWriter()
	{
		sw = new StreamWriter("Points.txt");
		sw.AutoFlush = true;

		if (chkbox1.Checked)
		{
			sw.WriteLine("Mouse_Events= true");

			// Timer installieren bei dessen Tick-Event die MousePosition Eigenschaft 
			// in die log- Datei eingetragen werden
			timer3          = new Timer();
			
			timer3.Tick    += new EventHandler(Timer3OnTick);
			timer3.Interval = 100;
			timer3.Start();
		}
		else
		{
			sw.WriteLine("Mouse_Events= false");
			sw.close();
		}
	}

	private void Timer2OnTick(object obj, EventArgs ea)
	{
		timer2.Stop();
		timer2.Tick -= new EventHandler(Timer2OnTick);

		/**/
		timer3.Stop();

		// anzeigen der HauptForm
		this.Show();
	}

	void Timer3OnTick(object obj, EventArgs ea)
	{
		mouseX= Cursor.Position.X;
		mouseY= Cursor.Position.Y;

		arrlstPts.Add(new Point(mouseX, mouseY));

		
		for (int i= 0; i<arrlstPts.Count; i++)
		{
			sw.WriteLine(arrlstPts[i]);
		}
	}

}

So, was ist anders. Der StreamWriter ist eine Membervariable. In jeder Methode der Klasse sichtbar.
In der Methode LogFileWriter wird die Datei geöffnet, und der Writer ist zum Schreiben bereit.

Wenn der Timer3 seine Ticks hat, ist der StreamWriter schon offen, und kann zum Schreiben benutzt werden.
Wenn Timer2 'tickt' und alles beenden soll, wird der StreamWriter auch beendet. (Und was bei dir nicht erstichtlich war, Timer3 muss auch beendet werden.)

Wenn du die Datei immer wieder verwenden willst, also Daten anhängen, solltest du dir mal andere Arten zum Öffnen von Dateien ansehen. Die File-Klasse ist interessant, und die versch. Überlagerungen der StreamWriter Klasse.

Weiter solltest du deine Variablen-Namen besser wählen. Aus Timer2 Timer3 sw sw1 etc. ist nicht ersichtlich wozu du sie verwendest.

Timer_CloseLog , Timer_WriteMousePosition oder so in die Richtung ist Besser. Da musst du nicht erst überlegen welcher wofür nun eigentlich da ist.

Mfg,
Alex
 
Danke für deine Antwort, hab´s gleich mal ausprobiert.
Und irgendwie hat es nicht so hingehauen!

wenn ich den StreamWriter (sw) gleich am Anfang der Klasse erstelle dann erkennt er alle sw- Anweisungen in der void LogFileWriter nicht, wenn ich ihn in der void erstelle dann erkennt er die sw- Anweisungen nur in der if- Schleife nicht.

Fehlermeldung des Compilers:

Der Typ oder Namespace 'sw' konnte nicht gefunden werden. Möglicherweise fehlt eine Anweisung oder ein Assemblyverweis.
 
Zeig dann mal den Aufbau deiner Klasse, bis auf den Block, in dem die Controls erstellt werden, der wird wohl zu groß sein.

Oder geh nochmal durch wie den Programm abläuft, wann wo was initialisiert werden muss damit es wo existiert.
 
Wenn du magst würd ich dir mal den Quelltext schicken, an deine e-mail addy, weil ich keine lust hab den hier zu posten!

mfg
 

Neue Beiträge

Zurück