VB2008 Label ändern
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
Antwort schreiben
Antwort 1 von malSchauen vom 27.09.2021, 15:56 Options
Hi,
Klar sollte das gehen den LableText zur Laufzeit mehrmals zu ändern. Warum auch nicht?
Kurzer Test:
-neues Project (Windows Forms)
-einen Button einfügen
-einen Timer einfügen
-ein Label einfügen
-Rechtsklick auf einen leeren Bereich von Form1, "Code anzeigen"
-hier folgendes Einfügen
Dim i As Integer
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
Label1.Text = ""
i = 0
If Timer1.Enabled = False Then
Timer1.Enabled = True
Else
Timer1.Enabled = False
End If
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Timer1.Tick
i += 1
Label1.Text = i & " mal geändert"
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Load
Timer1.Interval = 2000
Label1.Text = ""
End Sub
Debugging starten und auf den Button1 klicken. Nun sollte sich der LableText alle 2 sek ändern.
Mögliche Fehler (ohne Deinen Code zu kennen):
-Verwendung von Variablen um den Text zusammenzusetzen => Gültigkeitsbereiche beachten (z.B. Ausblenden von modulweiten Variablen bei gleichnamigen (lokalen) Variablen in der Procedure)
-Codezeile zur Textänderung oder auch zur Variablenänderung wird nur ein einziges Mal durchlaufen (falsche Verzweigung, falsche Bedingungen, etc.)
- usw. usf.
Bye
malSchauen
Antwort 2 von tkder1 vom 27.09.2021, 16:51 Options
erstmal vielen Dank für die Antwort, allerdings kann ich das nicht ganz umsetzen...
ich habe bei mir kein Button auf den ich drücken kann sondern nur timer bzw. es läuft alles automatisch nach bestimmten zeiten ab....
jetzt müsste sich das label auch nur noch nach einer bestimmten zeit ändern...
habs mal damit probiert...klappt aber nicht...
For x = 0 To 60
x = x + 1
If x = 10 Then
Label13.Text = "Status abfragen..."
If x = 20 Then
Label13.Text = "Verbindung wird hergestellt..."
End If
End If
Next
Der Code steht in der Private Sub Timer1.
Danke schonmal....
Antwort 3 von malSchauen vom 27.09.2021, 17:21 Options
Hi,
Das Du das in Deinem Programm so nicht wiederfinden kannst, ist klar. Daher schrieb ich auch, Du mögest für einen Test meines Codes ein neues Project aufmachen. Aber egal.
Ich nehme an, Dein LableText ändert sich auf "Status abfragen..." und bleibt dann so? Da Du ja nur Denkanstösse forderst: Schau Dir den zweiten IF-Block und dessen Position im Code mal ganz genau an. ;-)
Bye
malSchauen
Antwort 4 von malSchauen vom 27.09.2021, 21:02 Options
Hi,
@tkder1
Noch nicht gelesen, oder brauchst Du noch einen Tipp zur Selbsthilfe?
Tipp:
Untersuche mal Deinen Code aus #2 daraufhin, WANN die Bedingung "x =20" abgefragt wird, und ob sie zu diesem Zeitpunkt jemals wahr sein kann.
Bye
malSchauen
Antwort 5 von coros vom 28.09.2021, 07:29 Options
Hallo Tobias,
da hat @malSchauen wohl recht. Zum einen wird die Variable "x" nie den Wert 20 annehmen und zum anderen müssen beide If-Abfragen alleine und nicht verschachtelt stehen, denn es wird nie zu der Konstellation Wenn x = 10 und danach Wenn x = 20 kommen.
Warum wird die Variable "x" nie den Wert 20 annehmen? Weil einmal die Variable x durch die Schleifenschritte gefüllt wird, also von 0 bis 60 und gleich nach dem Füllen durch die Schleife durch die Addition x = x + 1 um den Wert 1 erhöht wird. Das bedeutet, am Anfang hat diese Variable den Wert 1 (Durch die Schleife den Wert 0, durch die Addition "x = x + 1" den Wert 1), beim nächsten hat Sie den Wert 3 (Durch die Schleife den Wert 2, durch die Addition "x = x + 1" den Wert 3), danach den Wert 5 (Durch die Schleife den Wert 4, durch die Addition "x = x + 1" den Wert 5)usw.
Noch eine andere Anmerkung. Ich habe hier gerade kein Visual Basic 2008 zur Verfügung, aber bei VB6 gab es die Eigenschaft ".Text" bei Labelfeldern noch nicht. Dort war es die Eigenschaft ".Caption". Eventuell ist dass auch noch ein Fehler?
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 6 von coros vom 28.09.2021, 08:57 Options
Hallo,
ich noch mal. Die Anmerkung bezüglich der "Label.Text-Eigenschaft" kann verworfen werden. Ich habe gerade in Visual Basic 2008 nachgesehen und dort gibt es die Eigenschaft ".Text".
Habe damit noch nicht soviel Erfahrung, daher die falsche Anmerkung.
Ich sollte eventuell doch etwas mehr mit VB2008 als mit VB6 machen.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 7 von tkder1 vom 28.09.2021, 09:59 Options
Hallo coros und malSchauen,
bitte entschuldigt das ich mich noch net gemeldet habe...bin zurzeit nicht "im Lande", also nicht direkt am Rechner an dem ich programmiere..
das mit der if schleife hab ich auch schon gemerkt ;)
wie kann ich es am besten realisieren das er einfach nur 1 bei jedem schleifendurchlauf hochzählt?
werde mich heute abend mal um die verschachtelung der if anweisungen kümmern...melde mich dann morgen wieder...
gruß und danke
Antwort 8 von coros vom 28.09.2021, 10:10 Options
Hallo Tobias,
lösche die Zeile
x = x + 1
aus Deinem Code heraus, denn das Hochzählen geschieht ja immer um den Wert 1 durch die Schleife.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 9 von tkder1 vom 28.09.2021, 10:18 Options
Hallo coros,
wie recht du doch hast....oh man, meine Programmierzeit liegt wohl doch schon länger zurück als gedacht...
aber ich fitz mich schon wieder rein ;)
Vielen Dank
Antwort 10 von coros vom 28.09.2021, 10:19 Options
Hallo Tobias,
gerne geschehen. Ist das Problem denn nun gelößt oder nicht?
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 11 von tkder1 vom 28.09.2021, 10:22 Options
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
Antwort 12 von tkder1 vom 29.09.2021, 08:34 Options
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...
Antwort 13 von coros vom 29.09.2021, 08:39 Options
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
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 14 von tkder1 vom 29.09.2021, 08:50 Options
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
Antwort 15 von coros vom 29.09.2021, 09:46 Options
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
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 16 von tkder1 vom 29.09.2021, 09:52 Options
hallo oliver,
du bist der beste...genau das ist es...
Somit ist dieses Problem erstmal gelöst...
Vielen vielen Dank!!!
mfg Tobias
Antwort 17 von coros vom 29.09.2021, 09:55 Options
Hallo Tobias,
gerne geschehen. Danke auch für die Rückmeldung.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 18 von JasonDelife vom 29.09.2021, 16:53 Options
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.
Antwort 19 von coros vom 29.09.2021, 17:12 Options
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
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 20 von JasonDelife vom 29.09.2021, 17:36 Options
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=103...Oder auch:
http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet...Grüße, JasonDelife.