habe mich mal an nen neues "Projekt" gemacht und da ist mir die clevere Idee gekommen. Eine Function, die es ermöglicht auf Buttondrück ein bestimmtes Control horizontal aus der Form zu sliden. Doch meine Routine schafft das nicht flüssig. Ich hoffe ihr könnt mir helfen.
PHP Code:
Public Sub MoveLeft(ByVal outObject As Control)
Dim xLoc As Integer = outObject.Location.X
Dim yLoc As Integer = outObject.Location.Y
Do Until xLoc = 0
Sleep(1)
xLoc -= 3
outObject.Location = New Point(xLoc, yLoc)
Loop
Um es wirklich aus der Form raus zu sliden, brauchst du noch die Breite, außerdem ist Sleep(1) doch sehr gering.
Code:
Public Sub Slide(outObject As Control, direction As Integer)
'
' * 1 = Left
' * 2 = Right
' * 3 = Up
' * 4 = Down
'
Dim xLoc As Integer = outObject.Location.X
Dim yLoc As Integer = outObject.Location.Y
If direction = 1 OrElse direction = 2 Then
Dim width As Integer = outObject.Width
Dim pWidth As Integer = outObject.Parent.Width
While If(direction = 1, Not (xLoc <= -width), Not (xLoc >= pWidth))
System.Threading.Thread.Sleep(30)
xLoc = If(direction = 1, xLoc - 3, xLoc + 3)
outObject.Location = New Point(xLoc, yLoc)
End While
Else
Dim height As Integer = outObject.Height
Dim pHeight As Integer = outObject.Parent.Height
While If(direction = 3, Not (yLoc <= -height), Not (yLoc >= pHeight))
System.Threading.Thread.Sleep(30)
yLoc = If(direction = 3, yLoc - 3, yLoc + 3)
outObject.Location = New Point(xLoc, yLoc)
End While
End If
outObject.Visible = False
End Sub
doevents oder [object].refresh (wenn ich mich recht erinnere) ist an dieser stelle äußerst angebracht da sonst im zweifel die entsprechenden anfragen an das gui erst nach einem kompletten durchlauf der funktion bearbeitet werden
Von Application.DoEvents ist abzuraten.
Angenommen, ich erstelle ein Fenster, welches von eins bis einer Million zählt und bei jedem Durchlauf eine Anzeige aktualisiert und eine Variable ändert. Nur möchte ich das Fenster nicht zum Einfrieren bringen und nutze daher Application.DoEvents. Nur dauert das einfach zu lange, und so wird das Fenster vorzeitig geschlossen. Aber die Schleife ist ja noch nicht zu Ende! So kann es dazu kommen, dass ein Prozess einfach so im Hintergrund weiterläuft. Es könnte auch passieren, dass zwischenzeitlich auf einen anderen Knopf gedrückt wird. Dann wird die Variable natürlich geändert, der Knopfdruck muss schließlich abgearbeitet werden. Wenn dann aber die Warteschlange abgearbeitet ist, kann ich mit der ursprünglichen Schleife fortfahren. Aber was ist das? Die Variable enthält jetzt einen vollkommen anderen Wert! Das ignoriere ich aber und durchlaufe brav weiter meine Schleife, dass das Programm nun fehlerhaft arbeitet, kann mir ja egal sein. Der Anwender wäre darüber aber womöglich weniger erfreut... Dann will ich ihm noch viel Erfolg bei seiner Arbeit wünschen, während er seinen verlorenen Daten hinterhertrauert.
Von Application.DoEvents ist abzuraten.
dann hast du nen ziemliches **** programm... von aus schleifen rausspringen und einer kontroll instanz haste auch noch nichts gehört, naja egal.
doEvents oder eben refresh ist min genau dann angebracht wenn du im main thread das gui so verändern willst das ein weiterer thread zum verabeiten nicht in frage kommt, wie das hier meiner meinung nach der fall ist
dann hast du nen ziemliches **** programm... von aus schleifen rausspringen und einer kontroll instanz haste auch noch nichts gehört, naja egal.
Verbreite doch bitte nicht solche Lügen... Ich habe kein solches Programm, das war nur ein Beispiel. Und natürlich habe ich "von aus schleifen rausspringen und einer kontroll instanz [...] gehört", wo denkst du hin?
Quote:
doEvents oder eben refresh ist min genau dann angebracht wenn du im main thread das gui so verändern willst das ein weiterer thread zum verabeiten nicht in frage kommt, wie das hier meiner meinung nach der fall ist
Warum sollte man das Fenster so verändern wollen, dass Threads, die irgendetwas verarbeiten, nicht in Frage kommen? Was hast du nur gegen Threads? Mit Threads geht das doch wunderbar: der Button bewegt sich, ich muss mich nicht erst von dem Button "freiklicken", das Programm läuft nicht nach dem Schließen des Fensters weiter, die Schleife wird nicht von Dateidialogen unterbrochen (so ein Verhalten ist natürlich auch mit Threads möglich), es wird kein Application.DoEvents genutzt.