[VB.NET]Control aus Form "sliden"

12/11/2012 21:49 coladose#1
Hallo ihr lieben,

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(xLocyLoc)
        
Loop

        outObject
.Visible False
End Sub 
12/11/2012 22:10 boxxiebabee#2
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
12/12/2012 19:39 coladose#3
Okay, der sleep war anfänglich auf 75ms doch lief und läuft es mit meiner Routine unflüssig. Werde mal deine testen und schauen ob es flüssiger geht :)
12/13/2012 18:22 Sedrika#4
Statt sleep, wie sieht es aus mit Application.DoEvents() ?
12/14/2012 10:28 tolio#5
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
12/14/2012 16:39 Tasiro#6
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.
12/14/2012 20:20 tolio#7
dann hast du nen ziemliches crap 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
12/15/2012 17:41 Tasiro#8
Quote:
Originally Posted by tolio View Post
dann hast du nen ziemliches crap 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.