Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [VB.NET] muovere un Panel

    Ciao, cercavo di fare un'animazione per muovere un panel

    Panel1.Location.X = 300 restituisce l'errore che è una proprietà in sola lettura e che non si può, quindi, assegnarle un valore

    qualche consiglio?

  2. #2
    O
    codice:
    Panel1.Left = 300
    o
    codice:
    Panel1.Location = New Point(300, Panel1.Location.Y)
    . La prima dovrebbe essere un pelo più efficiente.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Funzionano entrambe alla grande, grazie 1000!

  4. #4
    Scusa ma...
    codice:
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim i As Integer = 0
            For i = 1 To 300
                Panel1.Left = i
                System.Threading.Thread.Sleep(10)
            Next
        End Sub
    ...il fatto che abbia messo una pausa nel ciclo e che non abbia ottenuto l'effetto sperato di un'animazione è normale, vero?

    Si deve usare un timer in questi casi?
    Scusa le domande basilari, fino a ieri lavoravo solo per il web e prima di ajax non avevo mai usato neppure il Thread.Sleep

  5. #5
    O prima della sleep inserisci un Application.DoEvents() o un Panel1.Refresh() (meglio) o usi un timer. In ogni caso non credo che otterrai un'animazione molto fluida.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6

    Risoluzione

    Ciao,
    ho provato sia con DoEvents() che con Refresh() ma non vedevo l'animazione.
    L'effetto che faceva era di fare le pause tutte insieme e, solo alla loro fine, spostava il panel con un 'colpo secco'.

    Col timer è andata un pelino meglio ma, purtroppo, come avevi prognosticato, l'animazione risultante non era delle più fluide.

    Tuttavia, aggiungendo un piccolo effetto di easing (la simulazione dell'inerzia) e sperimentando con la durata dell'intervallo del timer (ora a 35) , sono riuscito ad ottenere un risultato meno osceno del previsto e che, in alcuni casi, potrebbe anche far comodo :

    codice:
    Public Class easingPanel
    
        Public direction As String = "sinistra"
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If direction = "destra" Then
                Dim targetX As Integer = 500
                Dim distX As Integer = targetX - Panel1.Location.X
                If Panel1.Location.X <= targetX - 2 Then
                    Dim movex As Integer = distX / 2
                    Panel1.Left += movex
                Else
                    Panel1.Left = 500
                    Timer1.Enabled = False
                    direction = "sinistra"
                End If
            Else
                Dim targetX As Integer = 10
                Dim distX As Integer = targetX - Panel1.Location.X
                If Panel1.Location.X >= targetX + 2 Then
                    Dim movex As Integer = distX / 2
                    Panel1.Left += movex
                Else
                    Panel1.Left = 10
                    Timer1.Enabled = False
                    direction = "destra"
                End If
            End If
            lblX.Text = Panel1.Location.X
        End Sub
    
        Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click
            Timer1.Enabled = True
        End Sub
    
    End Class
    I sorgenti del mini-progetto: easingPanel

    Ti ringrazio tantissimo per l'aiuto!
    Se ti viene in mente come migliorare l'effetto fatti vivo!

  7. #7
    Sulla mia macchina l'animazione è molto fluida, complimenti , la simulazione di "frenata" tra l'altro è molto gradevole. Bisogna però vedere l'effetto su macchine meno recenti...
    Tra parentesi, invece di usare una variabile stringa per memorizzare la direzione ti basta usare una variabile booleana.
    codice:
    Public Class easingPanel
    
        Public moveToRight As Boolean = True
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If moveToRight Then
                Dim targetX As Integer = 500
                Dim distX As Integer = targetX - Panel1.Location.X
                If Panel1.Location.X <= targetX - 2 Then
                    Dim movex As Integer = distX / 2
                    Panel1.Left += movex
                Else
                    Panel1.Left = 500
                    Timer1.Enabled = False
                    moveToRight = False
                End If
            Else
                Dim targetX As Integer = 10
                Dim distX As Integer = targetX - Panel1.Location.X
                If Panel1.Location.X >= targetX + 2 Then
                    Dim movex As Integer = distX / 2
                    Panel1.Left += movex
                Else
                    Panel1.Left = 10
                    Timer1.Enabled = False
                    moveToRight = True
                End If
            End If
            lblX.Text = Panel1.Location.X
        End Sub
    
        Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click
            Timer1.Enabled = True
        End Sub
    
    End Class
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Grazie ancora dei consigli, ora ci faccio un po' di esperimenti anche se son sicuro che non sia una tecnica più di tanto produttiva ...altrimenti, a quest'ora, sarebbe diffusa al punto che l'avrei trovata googlelando.

    A naso le prestazioni su una macchina lenta crollerebbero.

    Io, intanto, ci metto la boolean che mi hai consigliato, poi ...chissà che non provi a farci un'interfaccia pazza per qualcuno dei miei basilarissimi tool

  9. #9
    Ho sistemato i sorgenti del mini-progetto con la variabile boolean e ho aggiunto un paio d'istruzioni che, se scommentate, fanno star fermo il panel e muovere la form.
    L'inutility è scaricabile quì.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.