Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Non sono uno che vuole la pappa pronta, ma se il codice è
questo, non potevo mai scriverlo da solo, le miei competenze non sono così avanzate. Perciò se avete la pazienza di spiegarmi ciò che scrivete, ve ne sarei grato.
buona sera a tutti,
riguardo al codice che hai scritto dovresti spiegarmi proprio la prima parter di codice, perche hai creato una "private bussola" e non hai caricato l immagine di default?
secondo:
che differenza c'è tra le variabili che hai creato con "private" (destinazione, avanzamento, direzione) e quelle create con "dim", non sono sempre variabili?
sto modificando il codice secondo le mie esigenze, ma non so dove è sbagliato, mi sembra giusto percheè non da erroi, ma a volte si impalla. l ho modificato secondo cui la rotazione avvenga al cambiare del testo di una label e poi in base alle mie modifiche est e west sono invertite, cioè est è a 270 gradi e west è a 90 gradi, e il timer non scatta subito al primo click.
Codice sorgente - presumibilmente VB.NET
Imports System.Drawing.Drawing2D
Partial PublicClass Form1
Private bussola As Image =New Bitmap("bussola.png")' bmp in ram dal file originale, deve esistere nella cartelle dell'eseguibile
Private destinazione AsInteger
Private avanzamento AsInteger
Private direzione AsInteger
PrivateSub Form1_Load(sender AsObject, e As EventArgs)HandlesMyBase.Load
questa modifica perchè?
perchè la direzione avverrà tramite un gps collegato ad darduino, e nel codice attraverso una variabile che leggerà la lettera che arriverà attraverso la serialport la text della label diventarà le direzione, mi spiego meglio.
buona sera a tutti,
riguardo al codice che hai scritto dovresti spiegarmi proprio la prima parter di codice, perche hai creato una "private bussola" e non hai caricato l immagine di default?
secondo:
che differenza c'è tra le variabili che hai creato con "private" (destinazione, avanzamento, direzione) e quelle create con "dim", non sono sempre variabili?
con: Dim bussola As Image = New Bitmap("bussola.png") si carica l'immagine dall'HDD. Quando non si specifica il percorso l'immagine viene cercata nel percorso dell'eseguibile.
Se carichi l'immagine come risorsa e poi usi: Dim bussola As Image = New Bitmap(My.Resources.bussola), è la stessa cosa, la scelta sta a te. Come risorsa l'immagine viene inglobata nell'eseguibile e per sostituirla bisogna ricompilare il programma, se invece la includi nella cartella dell'eseguibile la puoi modificare senza ricompilare l'eseguibile, è sufficiente che abbia il nome giusto.
Dim e Private per dichiarare una varibile hanno differenze solo nell'ambito di visibilità tra classi, in questo caso è ininfluente puoi sostituire i Private con Dim.
sto modificando il codice secondo le mie esigenze, ma non so dove è sbagliato, mi sembra giusto percheè non da erroi, ma a volte si impalla. l ho modificato secondo cui la rotazione avvenga al cambiare del testo di una label.
Così non va bene ma quasi ci sei.
Per fare in modo che la label dove scrivi: Nord, Sud, Est, West, abiliti il Timer, devi attivare l'evento Label1.TextChanged, il codice che hai scritto va lì:
Codice sorgente - presumibilmente VB.NET
PrivateSub Label1_TextChanged(sender AsObject, e As EventArgs)Handles Label1.TextChanged
If Label1.Text="NORD"Then
If avanzamento = 0 ThenExitSub
destinazione =0
' sceglie la direzione di rotazione
If avanzamento < 180 Then direzione =-2 Else direzione = 2
timer1.Enabled=True
ElseIf Label1.Text="WEST"Then
If avanzamento = 90 ThenExitSub
destinazione =90
' sceglie la direzione di rotazione
If avanzamento > 90 Then direzione =-2 Else direzione = 2
timer1.Enabled=True
ElseIf Label1.Text="SUD"Then
If avanzamento = 180 ThenExitSub
destinazione =180
' sceglie la direzione di rotazione
If avanzamento > 180 Then direzione =-2 Else direzione = 2
timer1.Enabled=True
ElseIf Label1.Text="EST"Then
If avanzamento = 270 ThenExitSub
destinazione =270
' normalizza
If avanzamento = 0 Then avanzamento =360
' sceglie la direzione di rotazione
If avanzamento > 180 Then direzione =-2 Else direzione = 2
timer1.Enabled=True
EndIf
EndSub
Togli timer1.Enabled = True nel codice dei button
Codice sorgente - presumibilmente VB.NET
PrivateSub butNord_Click(ByVal sender AsObject, ByVal e As EventArgs)Handles butNord.Click
Label1.Text="NORD"
EndSub
PrivateSub butEst_Click(ByVal sender AsObject, ByVal e As EventArgs)Handles butEst.Click
Label1.Text="EST"
EndSub
PrivateSub butSud_Click(ByVal sender AsObject, ByVal e As EventArgs)Handles butSud.Click
Label1.Text="SUD"
EndSub
PrivateSub butWest_Click(ByVal sender AsObject, ByVal e As EventArgs)Handles butWest.Click
Label1.Text="WEST"
EndSub
e togli gli if dentro al codice di Timer1
Codice sorgente - presumibilmente VB.NET
PrivateSub timer1_Tick(sender AsObject, e As EventArgs)Handles timer1.Tick
avanzamento += direzione
avanzamento = avanzamento Mod360' azzera a 360°
rotate(avanzamento)
If avanzamento = destinazione Then timer1.Enabled=False
EndSub
Come funziona il codice così modificato?
Quando premi un button vene modificato il testo in Label1, si scatena l'evento: Label1.TextChanged ed il codice relativo viene eseguito, gli if impostano i valori corretti e poi si attiva il timer che richiama la routine rotate() ciclicamente, finquando non si è raggiunta la desinazione.
Come avevi fatto tu, la scelta dei valori venivano ripetutamente reinizializzati ogni volta che il codice in Timer1 veniva eseguito.
Ricorda che Timer1 riesegue il codice ogni volta che sono trascorsi i millisecondi impostati in Interval.
Ultima modifica effettuata da Carlo il 04/03/2024 alle 0:35
questa modifica perchè?
perchè la direzione avverrà tramite un gps collegato ad darduino, e nel codice attraverso una variabile che leggerà la lettera che arriverà attraverso la serialport la text della label diventarà le direzione, mi spiego meglio.
Codice sorgente - presumibilmente VB.NET
dim lettera asinteger= serialport1.read
if lettera ="N"then
label1.text="NORD"
timer1.enabled=true
più o meno è quello che intendo fare.
Chiaro però non devi mettere timer1.enabled=true, perchè come modifichi il testo in label1, tutto procede come spiegato prima.