|
You last visited: Today at 16:59
Advertisement
[VB.NET]Control aus Form "sliden"
Discussion on [VB.NET]Control aus Form "sliden" within the .NET Languages forum part of the Coders Den category.
12/11/2012, 21:49
|
#1
|
elite*gold: 106
Join Date: Jun 2010
Posts: 2,256
Received Thanks: 3,866
|
[VB.NET]Control aus Form "sliden"
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(xLoc, yLoc) Loop outObject.Visible = False End Sub
|
|
|
12/11/2012, 22:10
|
#2
|
elite*gold: 0
Join Date: May 2008
Posts: 1,222
Received Thanks: 500
|
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
|
#3
|
elite*gold: 106
Join Date: Jun 2010
Posts: 2,256
Received Thanks: 3,866
|
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
|
#4
|
elite*gold: 18
Join Date: Sep 2009
Posts: 20,177
Received Thanks: 14,471
|
Statt sleep, wie sieht es aus mit Application.DoEvents() ?
|
|
|
12/14/2012, 10:28
|
#5
|
elite*gold: 2932
Join Date: Oct 2009
Posts: 6,966
Received Thanks: 1,097
|
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
|
#6
|
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
|
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
|
#7
|
elite*gold: 2932
Join Date: Oct 2009
Posts: 6,966
Received Thanks: 1,097
|
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
|
|
|
12/15/2012, 17:41
|
#8
|
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
|
Quote:
Originally Posted by tolio
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.
|
|
|
All times are GMT +2. The time now is 16:59.
|
|