4.9k Aufrufe
Gefragt in Anwendungen(Java,C++...) von
Hallo zusammen,

hab ne einfache Frage.
Kann man in Visual Basic 2008 ein Label mehrmals ändern?
Soll heißen:
Wenn mein Prog läuft soll sich als sogenannter "Status einer Aktion" das Label ändern, also der sichtbare Text.
Es klappt soweit das sich der voreingestellte Text einmal ändert, aber halt nicht mehrmals...

Sollte das gehen, bitte ich um denkanstöße in Sachen Quellcode.
Viele Dank.

gruß Tobias

20 Antworten

0 Punkte
Beantwortet von
Hallo coros,

ob das Problem gelöst ist kann ich dir erst heut abend sagen...dann kann ich das ganze erst wieder testen und auch wieder dran arbeiten...

gruß Tobias
0 Punkte
Beantwortet von
hallo,

ich habe das ganze mal probiert, habe dafür nen extra projekt angelegt um ein bisschen rumspielen zu können.

habe jetzt mal mit button probiert...und diesen code verwendet...


for x=0 to 1000

if x=100 then
label1.text="TEST"
end if

if x=1000 then
label1.Text="sadgjkhasiugha"
end if

next


aber immer wenn ich auf den button drücke, kommt nur der zweite text....der erste wird garnicht angezeigt...
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo,

dass der 1. Text nicht angezeigt wird, ist klar. Eine Schleife arbeitet so schnell, dass Du das in dem Labelfeld nicht sehen wirst. Füge mal eine MessageBox in die Abfragen ein, dann wirst Du sehen, dass es funktioniert.

For x = 0 To 1000

If x = 100 Then
label1.Text = "TEST"
MsgBox "1. Abfrage bei Schritt " & x
End If

If x = 1000 Then
label1.Text = "sadgjkhasiugha"
MsgBox "2. Abfrage bei Schritt " & x
End If

Next

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von
hallo,

is ja logisch, so schnell kann ich garnet schauen wie er das macht...

also mit der msgbox geht es...
wie mache ich es jetzt das er nach dem ersten text einfach mal ein paar sekunden wartet und dann in der schleife weitergeht bzw. dann erst den zweiten text anzeigt...?

habs mit
System.Threading.Thread.Sleep(1000)

probiert....klappt aber nicht, wenn ich die msgbox wegnehme...

danke
0 Punkte
Beantwortet von coros Experte (4k Punkte)
hallo Tobias,

mit nachfolgenden Zeilen sollte es klappen.

Dim x As Integer

For x = 0 To 1000
If x = 100 Then
Label1.Text = "TEST"
Application.DoEvents()
Threading.Thread.Sleep(2000)
End If

If x = 1000 Then
Label1.Text = "sadgjkhasiugha"
End If
Next
Hier wird der Text "TEST" für 2 Sekunden angezeigt, bevor die Schleife weiter abgearbeitet wird.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von
hallo oliver,

du bist der beste...genau das ist es...
Somit ist dieses Problem erstmal gelöst...
Vielen vielen Dank!!!

mfg Tobias
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo Tobias,

gerne geschehen. Danke auch für die Rückmeldung.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von jasondelife Mitglied (109 Punkte)
Auch wenn es so funktioniert möchte ich noch Anmerken, dass Application.DoEvents() und Thread.Sleep() der ungeschickteste Weg ist, den man nehmen kann. Es mag einfach sein, aber es bringt Nachteile:
- Application.DoEvents() kann unvorghersehbare Effekte haben, z. B. dass eine ButtonClick-Methode nocheinmal ausgeführt wird, obwohl der Button nicht gedrückt wurde. Im schlimmsten Fall endet das in einer Endlosrekursion.
- Wenn nicht, dann erschwert es doch sehr das debuggen.
Meistens sind Schleifen mit Thread.Sleep() besser mit dem System.Windows.Forms.Timer zu implementieren. In diesem Fall wäre vllt. ein BackgroundWorker gut.

Grüße, JasonDelife.
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo JasonDelife,

also ich kann sowohl gegen DoEvents, als auch gegen die Sleep-Methode nichts nachteiliges sagen. Ich verwende das schon seit Jahren in VB5, VB6 und in VBA und habe noch die das, was Du beschreibst, als Problem gehabt.
Daher sehe ich das nicht als ungeschickt an, sondern eher als Erfahrungswerte mit den Methoden.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von jasondelife Mitglied (109 Punkte)
Hallo Oliver.
Ich will ja nichts gegen dein Programmierpraxis sagen. Wahrscheinlich programmierst du länger als ich. Und in VB bis einschließlich Version 6 ist DoEvents() ok. Aber ab Version 7 (und VB2008 ist Version 9) ist es nicht mehr so. Das liegt daran, dass VB ab Version 7 eine .NET-Sprache ist (wie auch C#). Und in .NET gibt es dieses Phänomen, auch wenn es nicht jedesmal, im Zweifelsfall nur äußerst selten auftritt. In .NET ist es die Regel, dass:
1. Der GUI-Thread immer nur kurz beschäftigt werden darf, damit er schnell wieder auf Events lauschen kann und
2. nur aus dem GUI-Thread Steuerelemente angesprochen werden dürfen.
Das führt dazu, dass viele entweder:
- den BackgroundWorker / Thread nutzen und dabei dann Fehler beim direkten Zugriff auf Steuerelemente (direkt heißt hier ohne BeginInvoke()) erneten oder
- Einfach die lang laufende Aktion im GUI-Thread machen und mit DoEvents() die Eventverarbeitung am Leben erhalten.
Jedoch sollte man unter .NET lang laufende Aktionen in einen extra Thread verlagern und Steuerelemente mit BeginInvoke() updaten.
Wie gesagt, unter VB6 war das noch nicht wichtig, aber mit .NET ist es zwingend.
Siehe: http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032414598
Oder auch: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.languages.csharp/2007-09/msg02167.html

Grüße, JasonDelife.
...