Laden...

C# Textbox für anzeige der aktuellen tätigkeit

Erstellt von Scarface vor 19 Jahren Letzter Beitrag vor 19 Jahren 12.216 Views
S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren
C# Textbox für anzeige der aktuellen tätigkeit

Also: das Thema ist vielleicht nicht ganz klar.
Ich hab ein Programm geschrieben, was dateien kopiert ein paar batch dateien ausführt, ...
Diese Aktionen möchte ich nun in einer Textbox oder so während das alles läuft protokollieren. Das problem ist, während das läuft deaktiviert windows (ich glaub zumindest, dass windows schuld ist) alle steuerelement. mein protokoll erscheint also erst wenn alles fertig ist in der textbox. Kann ich das irgendwie einstellen, dass das auch parallel geht??

165 Beiträge seit 2004
vor 19 Jahren

Rufe nach jdem mal, wo du in die Textbox was schreibst

Application.DoEvents();

auf.

Y
220 Beiträge seit 2004
vor 19 Jahren

Hi!

Was meinst du mit alle Steuerelemente sind deaktiviert?
Kann es vielleicht sein, das deine Abläufe so schnell sind,
das dein Programm erst kopiert, und dann die Form aktualisiert?

Am besten wäre es, du postest den Quellcode, dann kann man
ziemlich schnell feststellen, wo es "hängt".

Yahoo

S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

deaktiviert heißt, dass z.B. die PopUp Buttons nicht "poppen", ...
wenn ich ne statbar einfüge geht's aber ich brauch das in ner textbox

S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

Also mit Application.DoEvents() geht's. Vielen Dank schonmal.
Aber wie krieg ich das jetzt hin, das er automatisch mitscrollt.

S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

Das hilft mir nicht wirklich weiter.
Ich hab ne Textbox mit automatischer Scrollleiste(über Properties eingestellt). Das dürfte doch eigentlich nicht so schwer zu realisieren sein oder??
Soll einfach, wenn eine neue Zeile eingefügt wird nach unten scrollen.

X
2.051 Beiträge seit 2004
vor 19 Jahren

private int count = 0;
private void button1_Click(object sender, System.EventArgs e)
{
	textBox1.AppendText((++count).ToString() + "\r\n");
	textBox1.SelectionStart = textBox1.Text.Length;     // SCROLL
}

S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

private void protocol(string text)
{
myFile.WriteLine(text);
statBar.Text += text + "\r\n";
Application.DoEvents();
statBar.SelectionStart = statBar.Text.Length;
}

funzt aber irgendwie nicht

X
2.051 Beiträge seit 2004
vor 19 Jahren
 
private void protocol(string text)
{
  myFile.WriteLine(text);
  statBar.Text += text + "\r\n";
  statBar.SelectionStart = statBar.Text.Length;
  
  Application.DoEvents();
}



S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

Nope, hab ich auch schon versucht. da bewegt sich gar nix.

X
2.051 Beiträge seit 2004
vor 19 Jahren

versuch mal mit textBox1.AppendText().

wie in meinem 1. Bsp.

wenn man Text einfach addiert funzt das aus irgendeinem grund nicht.

S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

Tatsächlich...find ich aber komisch. Muss doch eigentlich auch so gehen.

S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

Ich habe noch eine Frage:
kann ich über einen Button alle prozeduren, etc. in meinem formular canceln? Also ein abbrechen-Button, der alles stoppt.

Und 2.:
kann ich die Ausgabe einer Dosbox irgendwie in einer Textbox anzeigen lassen. In Echtzeit mein ich.

X
2.051 Beiträge seit 2004
vor 19 Jahren
  1. ja, man kann

  2. suche hier im Forum nach z.B. "umleiten"

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo Scarface,

da man normalerweise Aktionen nur an bestimmten Stellen unterberechen will oder kann, wird das einfachste sein, dass du eine boolsche Instanzvariable fStop deklarierst, die vor dem Beginn der Aktion(en) auf false gesetzt wird. Diese Variable wird von dem Aktionscode an den Punkten, an denen eine Unterbrechung möglich ist, abgefragt. Dann braucht der Button die Variable nur noch auf true zu setzen.

herbivore

S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

Ja hatte ich mir auch schon überlegt, aber da muss ich ja ewig viele if-abfragen einbauen. Ist n bischen mühsam. Das müsste doch auch besser gehen.

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo Scarface,

wenn deine Aktion in einem Thread läuft, dann kannst du Thread.Abort verwenden:

Löst eine ThreadAbortException im Thread aus, für den der Aufruf erfolgte, um den Prozess des Beendens des Threads zu beginnen. Durch den Aufruf dieser Methode wird der Thread i. d. R. beendet.

herbivore

S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

Also zur Dosbox: ich find nix was mir bei meinem Problem weiterhelfen würde.
mit dem .StandardOutput.ReadToEnd() zeigt er mir den Text erst an, wenn der Prozess bereits durchgelaufen ist, was schon einige minuten dauert und es wäre schön, wenn man währenddessen die zeilen sehen kann, um den status zu beobachten.

S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

Woher weiß ich ob das in nem Thread läuft????

S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

Aber wenn ich das mit thread.abort mach schließt das komplette programm.
😦 ist also eher ne notlösung

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo Scarface,

die Aktion läuft normalerweise nur in einem (extra) Thread, wenn du den Thread selber startest. Das sollte man bei langlaufenden Aktionen eigentlich sowieso immer so machen. Guck dir die Thread-Klasse einfach mal an und vermutlich wird sich auch im Forum hier was finden lassen.

ReadToEnd versucht natürlich alles auf einmal zu lesen, aber es gibt ja auch noch Read oder ReadLine. Dazu muss die "DOS"-Anwendung aber seine Ausgabe regelmäßig flushen. Was man machen kann, wenn die Anwendung das nicht tut, kannst du unter Altes Consolen C++ Prog -> C# Prog, No Flush Problem lesen.

herbivore

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo Scarface,

Aber wenn ich das mit thread.abort mach schließt das komplette programm.
😦 ist also eher ne notlösung

wenn du keinen extra Thread erzeugt hat, wirst du wohl den Haupt-Thread geschlossen haben. Dadurch wird dann natürlich das Programm beendet, aber das habe ich nicht gemeint! Gucks dir mal nochmal in Ruhe an.

herbivore

S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

Nochmal zur Dosbox: Hast du vielleicht nen bischen Beispielcode zu .Read()?
(hab so meine Probleme das in string umzuwandeln. Mit toString zeigt er mir ja nur die Zahlen an.)

P
939 Beiträge seit 2003
vor 19 Jahren

Hi Scarface,

So konvertiert man ein byte-Array in einen String.

byte[] byteArray = // ..
string s = Encoding.ASCII.GetString(byteArray);

Gruss
Pulpapex

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo Scarface,

in der Doku gibts doch guten Beispiel-Code. Ich denke du bist einfach bei der "falschen" Methode. Nimm


public override int Read(char[], int, int);

oder eben


public override string ReadLine();

HTH

herbivore

S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

Kann das eigentlich sein, dass ne TextBox maximal 32767 Zeichen lang sein kann. Der schneidet mir nämlich mittendrin das Protokoll einfach ab und schreibt nicht weiter. Höhere zahl eingeben hilft auch nix.

X
2.051 Beiträge seit 2004
vor 19 Jahren

keine ahnung, ob es so ist. aber wenn du mit TextBox so ein Problem Hast, dann nimm RichText (RichTextBox ??) anstatt der TextBox.

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo Scarface,

in der Doku von TextBoxBase.MaxLength steht zu lesen:

Hinweis zu Windows NT 4.0, Windows 2000, Windows Server 2003-Familie: Wenn für einzeilige Textfeld-Steuerelemente die MaxLength-Eigenschaft auf 0 festgelegt wird, beträgt die maximale Anzahl der Zeichen, die eingegeben werden können, 2147483646 bzw. die Anzahl, die durch den verfügbaren Speicher bestimmt wird, wenn diese geringer ist. Für mehrzeilige Textfeld-Steuerelemente beträgt die maximale Anzahl der Zeichen, die eingegeben werden können, 4294967295 bzw. die Anzahl, die durch den verfügbaren Speicher vorgegeben wird, wenn diese geringer ist.

Hinweis zu Windows 95, Windows 98, Windows 98 Zweite Ausgabe, Windows Millennium Edition: Wenn für einzeilige Textfeld-Steuerelemente die MaxLength-Eigenschaft auf 0 festgelegt wird, beträgt die maximale Anzahl der Zeichen, die eingegeben werden können, 32.766 bzw. die Anzahl, die durch den verfügbaren Speicher bestimmt wird, wenn diese geringer ist. Für mehrzeilige Textfeld-Steuerelemente beträgt die maximale Anzahl der Zeichen, die eingegeben werden können, 65.535 bzw. die Anzahl, die durch den verfügbaren Speicher vorgegeben wird, wenn diese geringer ist.

herbivore

S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

Komische Sache auch wenn ich 0 eingebe schneidet er's einfach ab. Mit ner Richtextbox geht's. Aber da funzt mein automatisches mitscrollen nicht mehr. Versteh ich nicht.

X
2.051 Beiträge seit 2004
vor 19 Jahren

richtextbox scroll

 
private const int WM_VSCROLL = 0x115;
[DllImport("user32.dll")]
private extern static bool PostMessage(IntPtr hwnd, int msg, int wp, int lp); 

private int count = 0;
private void button1_Click(object sender, System.EventArgs e)
{
	richTextBox1.AppendText((++count).ToString() + "\r\n");
	PostMessage(richTextBox1.Handle, WM_VSCROLL, 1, 0);
}

S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

Kannst du mir auch erklären, was da passiert??? Irgendwie durchschau ich das nicht.
Außerdem klappt das mit der DLL bei mir nicht. 😦
Gibt's da keine einfachere methode. Bei der TextBox war's doch auch voll einfach. Und überhaupt wieso funktioniert das nicht genauso???
Fragen über Fragen.

X
2.051 Beiträge seit 2004
vor 19 Jahren

PostMessage Funktion aus der user32.dll importieren (sieh dazu die DllImportAttribute-Klasse)


[DllImport("user32.dll")]
private extern static bool PostMessage(IntPtr hwnd, int msg, int wp, int lp); 

mit

PostMessage(richTextBox1.Handle, WM_VSCROLL, 1, 0);

sendest du eine Message an RichTextBox. Message ist WM_VSCROLL - Das vertikale Scrollen

wp = 1 (WPARAM SB_LINEDOWN) bedeutet 1 Zele nach unten scrollen (wp = 2 bedeutet nicht automatisch, 2 zeilen scrollen 🙂 )

mehr infos findest du in MSDN unter WM_VSCROLL

S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

Wie schon gesagt: Funzt bei mir irgendwie nicht. Außerdem muss das doch auch einfacher gehen.

X
2.051 Beiträge seit 2004
vor 19 Jahren

Was klappt es denn nicht mit der DLL?

versuch mal so:

[System.Runtime.InteropServices.DllImport("user32.dll")]
private extern static bool PostMessage(IntPtr hwnd, int msg, int wp, int lp);
S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

Jetzt funktioniert's.
Wieso macht der eigentlich immer nen Zeilenumbruch wenn der Text zu lang ist? Auch wenn ich "both" scrollbars anstelle, was irgendwie gar nix bringt.

X
2.051 Beiträge seit 2004
vor 19 Jahren

WordWrap = false;

S
Scarface Themenstarter:in
186 Beiträge seit 2005
vor 19 Jahren

Gut zu wissen.