| Autor |
Beitrag |
heinz_m
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 01.01.09 11:47
Ich bin gerade an den ersten Lernschritten in visual C#.
Wenn ich den folgenden Code ausführe und den StoppKnopf anklicke, reagiert
beim ersten Mal der Startknopf und erst beim zweiten Mal der Stoppknopf. Mit
den beiden MessageBox Anweisungen funktioniert es korrekt, wenn sie
auskommentiert sind, jedoch nicht.
Das Programm sollte die Farbe des Formulars ändern, bis der StoppKnopf
gedrückt wird. (Siehe "C# von Kopf bis Fuss", Seite 75 ff)
??
ich wünsche allen ein glückliches Neues Jahr
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
namespace kbf_76 { public partial class Form1 : Form { bool farbeAendern = true; public Form1() { InitializeComponent(); }
private void Startknopf_Click(object sender, EventArgs e) { farbeAendern = true; while (farbeAendern) { for (int c = 0; c < 255 && farbeAendern; c++) { this.BackColor = Color.FromArgb(c, 255 - c, c); System.Threading.Thread.Sleep(3); Application.DoEvents(); } for (int c = 255; c >= 0 && farbeAendern; c--) { this.BackColor = Color.FromArgb(c, 255 - c, c); System.Threading.Thread.Sleep(3); Application.DoEvents(); } } }
private void StoppKnopf_Click(object sender, EventArgs e) { farbeAendern = false; } } } |
Moderiert von UGrohne: C#-Tags hinzugefügt
Zuletzt bearbeitet von heinz_m am Fr 02.01.09 22:33, insgesamt 1-mal bearbeitet
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Do 01.01.09 12:23
Hallo Heinz und
Bitte sorge zunächst dafür, dass Dein Code als solcher erkennbar ist: Rufe Deinen Beitrag auf, mit der Schere auf "überarbeiten", die "Bereiche" öffnen, Code-Text markieren, den Plus-Button drücken, geänderten Text "absenden". Bitte achte auch auf korrekte Einrückungen.
C#-Quelltext 1: 2:
| private void MyButtonClick(object sender, EventArgs e) { ... } |
Bitte erkläre auch noch ausdrücklich, was Du willst, denn bei Deinem unlesbaren Code kann ich das nicht erkennen: Soll es sich um eine Änderung handeln, die einmal ausgeführt werden soll und dann bis zur nächsten Änderung erhalten wird; oder soll es eine kontinuierliche Änderung sein, die bis zum Stopp immer weiterläuft?
Ist Dir klar, dass Sleep sich auf jeweils 3 Millisekunden bezieht? Die minimale Reaktionszeit von Windows beträgt normalerweise 52 msec.
Gruß und Frohes Neues Jahr! Jürgen
|
|
miniC#
      
Beiträge: 75
Wiin XP Home
C# VS Express 2008
|
Verfasst: Do 01.01.09 14:05
bissi ulkig gestrickt alles.anbei ein kleines beispiel. ein timer für die steuerung und ne halbgare schleife fürs farbpingpong. ich habe zwar selbst nicht viel ahnung, aber einen thread anzuhalten, der auch die gui für dein programm führt, halte ich für nicht so eine gute idee. ich denke, wenn du unbedingt den thread.sleep nutzen willst , dann solltest du hier mal im forum nach dem thema suchen , da gab es grade einige threads dazu (hahah !!!).
hab dir schon bissi code gefaltet , zu faul zum suchen
frohes neues,
miniC#
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51:
| using System; using System.Drawing; using System.Windows.Forms;
namespace WindowsFormsApplication1 { public partial class Form1 : Form { private Timer _timer; private Random _r; private int[] _rgb; private int[] _rgbstep; public Form1() { InitializeComponent(); DoubleBuffered = true; _r = new Random(); _rgb = new int[3] { 0, 189, 75 }; _rgbstep = new int[3] { 1, 1, 1 }; _timer = new Timer(); _timer.Interval = 5; _timer.Tick += new EventHandler(this._timer_tick); }
private void _timer_tick(object sender, EventArgs e) { BackColor = _setcolor(BackColor); }
private Color _setcolor(Color c) { for (int i = 0; i < 2; i++) { if (_rgb[i] == 255) _rgbstep[i] = -1; if (_rgb[i] == 0) _rgbstep[i] = 1; _rgb[i] += _rgbstep[i]; }
return Color.FromArgb(255, _rgb[0], _rgb[1], _rgb[2]); }
private void Form1_MouseClick(object sender, MouseEventArgs e) { if (_timer.Enabled) _timer.Enabled = false; else _timer.Enabled = true; }
} } |
_________________ Zitat MDSN : " ... C# (gesprochen: "si scharp") "
|
|
heinz_m 
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 01.01.09 20:24
Titel: Erläuterung
Herzlichen Dank für die Hinweise zur Nutzung des Forums.
Das Programm sollte die Hintergrundfarbe des Fensters so lange dauernd verändern, bis der StoppKnopf gedrückt wird.
Mich erstaunt, dass der Startknopf reagiert, wenn ich den Stopknopf drücke.
Gruss
Heinz
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 01.01.09 20:52
Das wäre in der Tat merkwürdig  . Könntest du die erzeugte Exe hochladen?
_________________ >λ=
|
|
heinz_m 
Hält's aus hier
Beiträge: 5
|
Verfasst: Fr 02.01.09 00:01
Titel: und die Setup.exe
damit Ihr seht, was sich da tut

Einloggen, um Attachments anzusehen!
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 02.01.09 00:29
One-Click-Anwendungen sind zwar nett, aber kannst du nicht einfach die Exe selbst (in \bin\Debug) hochladen  ? Vor allem fehlen da ein paar Dateien.
_________________ >λ=
|
|
heinz_m 
Hält's aus hier
Beiträge: 5
|
Verfasst: Fr 02.01.09 10:59
Titel: und die exe
ich hoffe, das hilft. Danke für die Geduld.
Einloggen, um Attachments anzusehen!
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Fr 02.01.09 11:34
Hallo Heinz,
bei mir reagieren Start- und Stopp-Button wunschgemäß. Allerdings dauert es immer wieder etwas, bis ein Button reagiert. Das hängt vermutlich mit der seltsamen Art der Thread-Konstruktion zusammen, wie schon miniC# sagte.
Gruß und Frohes Neues jahr! Jürgen
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 02.01.09 14:29
Ich kann das reproduzieren, habe aber keine Ahnung woran das liegt, dazu kenne ich C# nicht gut genug.
Im Anhang ein Video, in dem man das sieht. Ich klicke erst auf Start, dann nur noch auf Stopp (zweimal, beim ersten Mal bewegt sich stattdessen Start).
Einloggen, um Attachments anzusehen!
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 02.01.09 14:35
Bei mir zeigt sich ein ähnliches Problem: Wurde der Startknopf gedrückt, reagiert der Stopknopf erst beim zweiten Klick, mit Tab+Space funktioniert es dagegen. Da hat die WinAPI wohl Probleme, einen zweiten Klick zu verarbeiten, wenn der erste noch gar nicht beendet wurde.
/Edit: Wohl das gleiche Phänomen wie bei jaenicke
Die einfachste Lösung dürfte ein Timer sein, vielleicht sinkt dadurch die Frequenz aber ein wenig.
_________________ >λ=
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 02.01.09 15:09
Nicht die Windows API hat damit ein Problem, .NET hat ein Problem damit
Im Anhang die exakt identisch umgesetzte Demo in Delphi, das funktioniert.
Und hier der ebenfalls nicht funktionierende Quelltext von VB .NET (gleiches Problem): Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| Public Class Form1 Private farbeAendern As Boolean
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click farbeAendern = True Dim c As Integer While farbeAendern For c = 0 To 254 BackColor = Color.FromArgb(c, 255 - c, c) System.Threading.Thread.Sleep(3) Application.DoEvents() Next For c = 254 To 0 BackColor = Color.FromArgb(c, 255 - c, c) System.Threading.Thread.Sleep(3) Application.DoEvents() Next End While End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click farbeAendern = False End Sub End Class | In .NET muss man das also anders lösen. Zum Beispiel mit einem richtigen Thread. (Oder einem Timer, ja.)
Einloggen, um Attachments anzusehen!
|
|
heinz_m 
Hält's aus hier
Beiträge: 5
|
Verfasst: Fr 02.01.09 22:29
Titel: Danke !
Ich bedanke mich herzlich bei allen, die sich um meine Frage gekümmert habe. Dass ich mit einem meiner ersten C# Vesuche, gleich .NET überlistet zu haben scheine, löst bei mir allerdings etwas gemischte Gefühle aus.
Auf jeden Fall werde ich in Zukunft mit Threads vorsichtiger umgehen.
Meine Frage war auch ein Test, wie aktiv das Forum ist und ich bin begeistert.
Grüsse
Heinz
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 02.01.09 22:36
Titel: Re: Danke !
|
|
mberle
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 03.01.09 17:12
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| public partial class Form1 : Form { bool farbeAendern = true; public Form1() { InitializeComponent(); StoppKnopf.Enabled = false; }
private void Startknopf_Click(object sender, EventArgs e) { Startknopf.Enabled = false; StoppKnopf.Enabled = true; farbeAendern = true; while (farbeAendern) { for (int c = 0; c < 255 && farbeAendern; c++) { this.BackColor = Color.FromArgb(c, 255 - c, c); System.Threading.Thread.Sleep(3); Application.DoEvents(); } for (int c = 255; c >= 0 && farbeAendern; c--) { this.BackColor = Color.FromArgb(c, 255 - c, c); System.Threading.Thread.Sleep(3); Application.DoEvents(); } } }
private void StoppKnopf_Click(object sender, EventArgs e) { Startknopf.Enabled = true; StoppKnopf.Enabled = false; farbeAendern = false; } } |
Hallo,
ich lerne ebenfalls mit dem Buch "Von Kopf bis Fuß". Ich habe mal eine Möglichkeit ergänzt damit das Programm zumindest so funktioniert wie es soll. - Wahrscheinlich nicht sehr elegant, aber ein Workaround.
|
|
|