PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Visual Basic 2008 - Aktion nur 1 mal ausführen bis X


Geldmann3
2012-08-11, 18:21:10
Hallo, ich habe eine Textbox, die sehr schnell "hochzählt", dabei ist sie einmal zwischen 10000 und 10100. (Textbox zur Visualisierung, dass ich sehe was abgeht) Nun fängt die Textbox immer dann, wenn ich die Maus bewege wieder von vorne an zu zählen. Das ist so gewollt. Ich möchte also zählen, wie lange ich die Maus nicht bewegt habe. Es soll 1 mal "Achtung" ausgegeben werden, zwischen 10000 und 10100. Und dann noch einmal "Jetzt einblenden" wenn wieder von vorn angefangen wird, sobald ich die Maus bewege. Komischerweise, zeigt der PC immer wieder "Jetzt einblenden" solange ich die Maus bewege

If Label2.Text < 10100 And Label2.Text > 10000 Then
MsgBox("Achtung")
Label3.Text = "Einblenden OK"
End If


If Label2.Text < 100 And Label3.Text = "Einblenden OK" Then

MsgBox("Jetzt einblenden")
Label3.Text = "Einblenden nicht ok"

End If

Warum kommt "Jetzt einblenden" immer wieder?? Label3.text ist doch dann gar nicht mehr "Einblenden ok"...
Optisch ist es immer auf "Einblenden OK" warum wird es nicht auf "Einblenden nicht ok" gesetzt?

MsgBox("Achtung") wiederholt sich nicht.

Monger
2012-08-11, 18:51:16
Wie sieht denn der Code aus mit dem du hochzählst?

Grundsätzlich mal ist es ne schlechte Idee, sich darauf zu verlassen was auf der Oberfläche angezeigt wird. Die Oberfläche wird asynchron zum Code aktualisiert, d.h. wenn du TextBox1.Text = "Bla" setzst, wird eigentlich nur das Event dazu erzeugt und in die Event Queue geschoben. Events werden eins nach dem anderen abgearbeitet, d.h. wenn du dich gerade in einem Event befindest (z.B. Timer.Tick oder was auch immer), dann kannst du zwar Events abfeuern, die werden aber erst verarbeitet wenn du das aktuelle Event verlässt.

Ergo: trenne zwischen Programmlogik und Darstellung, dann bist du auf der sicheren Seite. Nimm ein zusätzliches Integer Attribut um deine Mauszeit zu messen, und frage darauf ab. Du kannst gleichzeitig den Wert auch auf die Textbox rausschreiben, aber das dient zur Visualisierung für den Anwender, nicht der Programmlogik.

Geldmann3
2012-08-11, 18:58:50
Naja, zuerst habe ich das so gemacht, doch es hat nicht funktioniert. Jetzt habe ich erstmal alles auf Labels geschoben um zu sehen was passiert.

Hier nochmal mehr Quelltext
<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequenti al)> _
Public Structure LASTINPUTINFO
Public cbSize As UInteger
Public dwTime As UInteger
End Structure

<Runtime.InteropServices.DllImport("USER32.DLL")> _
Private Shared Function GetLastInputInfo(ByRef ii As LASTINPUTINFO) As Boolean
End Function


Public Function GetIdleTime() As Long
Try
Dim lastInPut As New LASTINPUTINFO()
lastInPut.cbSize = CUInt(System.Runtime.InteropServices.Marshal.SizeOf(lastInPut))

If GetLastInputInfo(lastInPut) Then
Dim el As Long = lastInPut.dwTime
Dim ui As Long = (Environment.TickCount - el)

' Overflow
If ui < 0 Then
ui = ui + UInteger.MaxValue + 1
End If

Return ui
Else
Throw New ApplicationException("Timespan")

End If
Catch ex As Exception
Beep()
End Try

End Function

Public Function GetIdleTimeSpan() As TimeSpan
Return New TimeSpan(GetIdleTime() * 10000)
End Function

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Button1.Text = "stop"
Timer1.Interval = 100 'ms
Timer1.Enabled = True
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

End Sub

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Label1.Text = Me.GetIdleTimeSpan.ToString
Label2.Text = Me.GetIdleTime.ToString
If Label2.Text < 10100 And Label2.Text > 10000 Then
MsgBox("Achtung")
Label3.Text = "Einblenden OK"
End If


If Label2.Text < 100 And Label3.Text = "Einblenden OK" Then

MsgBox("Jetzt einblenden")
Label3.Text = "Einblenden nicht ok"

End If

End Sub
End Class

Vom Prinzip müsste es doch eigentlich funktionieren.

Oh, ich glaub ich habs!!!! LOL der Code wird einfach erst weiter ausgeführt, wenn die MessageBox bestätigt wurde. Solange wird "Einblenden nicht OK" nicht geschrieben und um zu bestätigen muss man ja wiederum die Maus bewegen. Tricky^^