Buongiorno,
da poco che uso XoJo e ho alcuni dubbi riguardo alcune operazioni.
Il programma deve effettuare una operazione matematica tramite codice del PushButton.
Praticamente ho una equazione N/fc = f(d, fc/ft, z) (la Enne della equazione riesco ad esprimerla attraverso z, d e fcsuft) e devo trovare i diversi valori di z per punti per diversi valori di d e fcsuft, volendo che N/fc sia zero. Mi stato dato il seguente codice, e dovrei solo registrare i dati in una TextArea, ma non ho capito molto bene le operazioni che effettua il codice seguente.
Vi ringrazio
[ Dim Contatore As Integer
Dim d,z As Double
Dim max,deltaZ As Double
Dim fcsuft As Double
Dim Pigr As Double
Dim AzioneAssialeSufc As Double
Dim Enne As Double
Dim ValoreAdestra,Test As Double
Pigr=3.141592654
For d=4 To 40 Step 1
max=d/2
deltaZ=-max/20
For fcsuft=0.4 To 0.6 Step 0.02
Contatore=0
For z=max To 0 Step deltaZ
Contatore=Contatore+1
Enne=(z+fcsuft*d)/(1+fcsuft)
AzioneAssialeSufc=Pigr*d^2/8-d^2/4*Asin((d/2-z)/(d/2))-(d/2-z)*Sqrt(d^2/4-(d/2-z)^2)+2/(Enne-z)*(-1/3*(d^2/4-(d/2-z)^2)^(3/2)+(Enne-d/2)/2*(d^2/4*Asin((d/2-z)/(d/2))+(d/2-z)*Sqrt(d^2/4-(d/2-z)^2)+Pigr*d^2/8))
If Contatore=1 Then
ValoreAdestra=AzioneAssialeSufc
Else
Test=AzioneAssialeSufc*ValoreAdestra
If Test<0 Then
Exit For z
Else
ValoreAdestra=AzioneAssialeSufc
End If
Next
deltaZ=deltaZ/20
Contatore=0
For z=ValoreAdestra To 0 Step deltaZ
Contatore=Contatore+1
Enne=(z+fcsuft*d)/(1+fcsuft)
AzioneAssialeSufc=Pigr*d^2/8-d^2/4*Asin((d/2-z)/(d/2))-(d/2-z)*Sqrt(d^2/4-(d/2-z)^2)+2/(Enne-z)*(-1/3*(d^2/4-(d/2-z)^2)^(3/2)+(Enne-d/2)/2*(d^2/4*Asin((d/2-z)/(d/2))+(d/2-z)*Sqrt(d^2/4-(d/2-z)^2)+Pigr*d^2/8))
If Contatore=1 Then
ValoreAdestra=AzioneAssialeSufc
Else
Test=AzioneAssialeSufc*ValoreAdestra
If Test<0 Then
'manca qui il registrare nella textarea d, fcsuft nonch z
Exit For z
Else
ValoreAdestra=AzioneAssialeSufc
End If
Next
Next
Next]
A parte qualche errore di if non chiusi…
Ti consiglio di mettere utilizzare un thread altrimenti blocchi l’interfaccia… il calcolo molto lungo
Mettere il codice in un metodo (calcolo ad esempio)
aggiungere un paio di metodi msg(messaggio as auto) e terminato
Nel Run del Thread1 scrivi:
calcolo
Xojo.Core.Timer.callLater(20, weakAddressOf terminato) //Chiama la funzione nel thread principale
Nel tuo pushbutton scrivi:
me.enabled=false //per evitare di rilanciare il calcolo mentre in azione
Thread1.run //Per lanciare il thread del calcolo
in terminato scrivi:
Pushbutton1.enabled=true //Usa il nome del tuo pulsante serve a abilitarlo dopo il calcolo
in msg(messaggio as auto) scrivi:
dim t as text=messaggio //converte la variable auto in text
TextArea1.appendText t+endOfLine //Usa il nome della tua textArea
Nel calcolo quando vuoi mostrare i dati nella text area scrivi:
Xojo.Core.Timer.CallLater(0, addressOf msg, "d="+str(d, "#0.0000000000").ToText)
Xojo.Core.Timer.CallLater(0, addressOf msg, "fcsuft="+str(fcsuft, "#0.0000000000").ToText)
Xojo.Core.Timer.CallLater(0, addressOf msg, "z="+str(z, "#0.0000000000").ToText)
Grazie della risposta, ho corretto gli If e messo tutto il codice in un metodo (calcolo).
Ho aggiunto quindi gli altri due metodi che mi ha suggerito e il thread.
Non ho capito in che punto dovrei aggiungere le tre righe di codice per mostrare i dati nella text area.
Se faccio partire il programma, mi segnala i seguenti errori:
- Xojo.Core.Timer.callLater(20, weakAddressOf terminato) This item does not exist (evidenziando xojo)
- Sub msg(messaggio as auto) There is no class with this name (evidenziando auto)
- TextArea1.appendText t + endOfLine You have used an operator that is not compatible with the data types specified
- Window1 Type mismatch error. Expected variant, but got auto
Che versione di Xojo stai utilizzando?
Ah, ecco il motivo Xojo. e Auto sono stati introdotti successivamente.
Non puoi utilizzare una versione più recente?
S certo, per capire come funzionano Xojo. e Auto?
La ringrazio molto per l’aiuto
Ho provato con la versione più recente (2017 r2.1), scrivendo le tre linee di codice per il registro dei dati alla fine nel metodo “calcolo”.
Facendo partire la run e premendo poi il pushbutton, non ottengo risultati nella textarea.
usa il debugger per verificare che entri nel codice giusto.
Il fatto che non vedi i risultati dipende dal codice… le iterazioni sono troppe, probabilmente dovresti dividere la seconda iterazione (la prima relativamente veloce) in pi thread differenti ma questo comporta una complicazione del codice.
Xojo. il nuovo framework di Xojo che offre diverse funzionalit in pi, tra cui la possibilit di creare uno one shot timer a cui passi un metodo da eseguire (addressOf xxxx) e eventualmente un parametro
Questo parametro di tipo Auto, che in pratica un Variant specializzato ovvero pu essere qualsiasi cosa (tipo primitivo, oggetto etc) come un Variant, ma non puoi poi leggerlo con un altro tipo (ovvero non ha una conversione implicita che pu portare ad errori)
Nel nostro caso passiamo un Text che quindi andremo a rileggere come Text.
Text un altro nuovo tipo di dato, in pratica equivalente a String ma con meno compromessi sulla codifica (vale a dire non immediatamente convertibile in un memoryBlock)
In Xojo hai diversi tipi corrispondenti (tipo MemoryBlock, Date, Dictionary etc) per favorire il passaggio tra il vecchio Framework e il nuovo. Ma nel nuovo hai funzionalit pi “certe”
Un esempio di come sono differenti (utilizzando l’oggetto Date) lo puoi leggere qui: https://www.xojoitaliablog.com/impariamo-date-e-nuovo-framework/
Aumentando lo step di una variabile (quindi abbassando il numero di cicli), ora ottengo i valori di d, fcsuft e z. Ma solo i valori finali, mentre mi servirebbe sapere tutti i valori di z per le diverse combinazioni di d e fcsuft. Come posso modificare quindi la scrittura per registrare tutti i dati nella text area?
Posizionando le tre righe tra l’ultimo End If e il successivo Next, ottengo tutti i valori.
Il problema che ricavo un numero elevato di z, corrispondenti a valori uguali di d e fcsuft.
Non conosco l’algoritmo e non so dirti dove dovresti identificare le soluzioni.
Comunque mettendolo fuori dell’endif prima del next abbastanza ovvio che ottieni valori di z e stessi valori per gli altri due parametri essendo questi i due for esterni.