French Labels qui s'initialise mal B4A

scrat

Active Member
Licensed User
Longtime User
Bonjour

Je viens de m'apercevoir qu'il y a un forum français ce sera surement plus facile qu'en anglais ou j'avais commencé a poster

Je rencontre un problème.
Lorsque je lance l'application installée sur le GSM j'ai le droit a un message d'erreur

Error Occurred
error in sub main_accelerometer_accelerometerchanged .........
Object should first be initialized (labels)

Je ferme l'appli et je la relance et tout fonctionne normalement
Si je la referme et que je la relance : re-message d'erreur

Si je lance l'appli depuis le Bridge aucun souci tout fonctionne normalement

J'ai l'impression que l'accelero et démarré avant la création des labels

Les labels sont crées avec le designer et ne sont donc pas initialise a la main
Activity.LoadLayout("manege") et la premiere ligne de Activity_Create


B4X:
Sub Process_Globals
    Dim Accelerometer As PhoneAccelerometer   
End Sub

Sub Globals
Dim Titre1 As ImageView
Dim Titre2 As ImageView
Dim LabelX As Label
Dim LabelY As Label
Dim LabelZ As Label
Dim LabelTot As Label   
Dim LabelXmax As Label
Dim LabelXmin As Label
Dim LabelYmax As Label
Dim LabelYmin As Label
Dim LabelZmax As Label
Dim LabelZmin As Label
Dim LabelGmax As Label
Dim LabelGmin As Label
Dim Xmax As Float, Xmin As Float, Ymax As Float, Ymin As Float, Zmax As Float, Zmin As Float, Amax As Float, Amin As Float   
Dim Calibration As Boolean
Dim NbCount As Int
Dim CurrentCount As Int
Dim MaxScale As Float
Dim Raz As Button
Dim BtnQuit As Button

End Sub

Sub Activity_Create(FirstTime As Boolean)

If firstTime Then
Activity.LoadLayout("manege")

MaxScale=1
NbCount=50
CurrentCount=0
RazValue

'calibration si le fichier calib.txt n'existe pas
If File.Exists(File.DirDefaultExternal,"calib.txt")=False Then
   'si on ne peut pas ecrire sur la sd
   'pas de calibration
   If File.ExternalWritable = False Then
   Msgbox("Ecriture impossible sur la SD card.", "Pas de calibration possible")
   Calibration=False
   Return
   Else
   Msgbox("Poser votre GSM à plat et presser OK","Calibration")
   Calibration=True
   End If
Else
MaxScale=File.ReadString(File.DirDefaultExternal,"calib.txt")
End If


End If
End Sub

Sub Activity_Resume
Accelerometer.StartListening("Accelerometer")
End Sub



Sub Activity_Pause (UserClosed As Boolean)
Accelerometer.StopListening 
End Sub




Sub Accelerometer_AccelerometerChanged (X As Float, Y As Float, Z As Float)

Dim Ax As Float
Dim Ay As Float
Dim Az As Float


Ax=(X/9.81)/MaxScale
Ay=(Y/9.81)/MaxScale
Az=(Z/9.81)/MaxScale

'Calibration de l'accelero
If Calibration=True Then
Calibrate(AX,AY,AZ)
Return
End If
   
Atot=Sqrt(Ax*Ax+Ay*Ay+Az*Az)

SetMiniMax(Ax,Ay,Az,Atot)


LabelX.Text=" X: " & FormatVal(Ax,3,True)
LabelY.Text=" Y: " & FormatVal(AY,3,True)
LabelZ.Text=" Z: " & FormatVal(Az,3,True)
LabelTot.Text= FormatVal(Atot,1,False) & " G"

LabelXmax.Text="Xmax: " & FormatVal(Xmax,2,True)
LabelYmax.Text="Ymax: " & FormatVal(Ymax,2,True)
LabelZmax.Text="Zmax: " & FormatVal(Zmax,2,True)
LabelXmin.Text="Xmin: " & FormatVal(Xmin,2,True)
LabelYmin.Text="Ymin: " & FormatVal(Ymin,2,True)
LabelZmin.Text="Zmin: " & FormatVal(Zmin,2,True)
LabelGmin.Text=FormatVal(Amin,1,False) & " Gmin"
LabelGmax.Text=FormatVal(Amax,1,False) & " Gmax"

End Sub



Sub FormatVal(V As Double,Nb As Int,Sgn As Boolean) As String

Dim T As String
Dim S As String
S=""
If Sgn=True Then
If V>=0 Then 
S="+ "
Else
S="- "
End If
End If

V= Abs(V)

T=S & NumberFormat2(V,1,Nb,Nb,False)

Return T
End Sub


Sub SetMiniMax(X As Float,Y As Float,Z As Float, Atot As Float)
If X>Xmax Then Xmax=X 
If Y>Ymax Then Ymax=Y
If Z>Zmax Then Zmax=Z
If X<Xmin Then Xmin=X
If Y<Ymin Then Ymin=Y
If Z<Zmin Then Zmin=Z
If Atot>Amax Then Amax=Atot
If Atot<Amin Then Amin=Atot
End Sub


Sub RazValue
Xmax=-10
Ymax=-10
Zmax=-10
Amax=-10
Xmin=10
Ymin=10
Zmin=10
Amin=10
End Sub



Sub Raz_Click
RazValue
End Sub


Sub BtnQuit_Click
Dim Rep As Int
Rep = Msgbox2("Vraiment quitter?", "A T T E N T I O N", "Oui", "", "Non", Null) 
 If Rep = DialogResponse.POSITIVE Then
  Accelerometer.StopListening
  Activity.Finish
 End If
  
End Sub


Sub Calibrate(XX As Float,YY As Float,ZZ As Float)
If CurrentCount<NbCount Then
If XX>MaxScale Then MaxScale=XX
If YY>MaxScale Then MaxScale=YY
If ZZ>MaxScale Then MaxScale=ZZ
CurrentCount=CurrentCount+1
Else
File.WriteString(File.DirDefaultExternal, "calib.txt",MaxScale)
Calibration=False
End If

End Sub


J'ai essaye de rafraichir les labels dans un timer mais j'ai le même probleme

J'ai aussi essayé de creer les labels a la main et j'ai toujours le même probleme

Etant débutant en B4A je doit surement faire une erreur grossiere mais je ne vois pas

Merci de m'éclairer
 
Last edited:

klaus

Expert
Licensed User
Longtime User
Est-ce que tu peux poster ton projet sous la forme d'un fichier zip (dans le menu de l'éditeur Files/Export As Zip).
Seulement avec le code que tu as posté il est impossible de déterminer d'où vient le problème.

Meilleures salutations.
 

scrat

Active Member
Licensed User
Longtime User
Merci Klauss

Erel vient de me donner la solution dans le forum Anglais

En fait il faut que Activity.LoadLayout ne soit pas dans la condition "firsttime" mais appelé a chaque fois.

Je pensais a tord que cet évenement été un équivalent de OnFormCreate en Pascal.

Si tu as un lien vers une documentation sur les évenements je suis preneur
 

zouriteman

Member
Licensed User
Longtime User
to SCRAT :

Moi aussi , je peine à convertir mes connaissances et habitudes de DELPHI vers B4A ou ANDROID : les notions de "évenements" y sont beaucoup plus obscures.

je sens qu'il va y avoir de l'entraide dans ce forum , a condition que les intervenants indiquent bien d'ou ils viennent ( C++ , VB6 , DELPHI par exemple)
 

klaus

Expert
Licensed User
Longtime User
Quelques clarifications sur la notion 'évènement'.
La notion d'évènement est la même dans Android que dans les autres languages tel que VB, C ou Delphi.
Les différents objets peuvent provoquer des évènements en fonction des manipulations de l'utilisateur et ces évènement peuvent être traités dans des routines adéquates.
On devrait plutôt dire qu'elle est la même que dans d'autres systèmes d'exploitation, car c'est là que réside la grande différence.
Dans Widows il y a les formes, alors que dans Android nous avons des Activities donc des activités.
La fonction et surtout le 'cycle de vie' des ces activités est très différent de celui des formes de Windows.
J'ai traduit en français les tutoriels de base pour débuter avec Basic4Android.

Meilleures salutations.
 
Top