French creer classe avec des imageviews

fgh3966

Active Member
Licensed User
Bonsoir

Je voudrais créer une classe avec des imageview
Y aurit il des exemples simples clair


code module:
'Code module
'Subs in this code module will be accessible from all modules.
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
  
    'Public ImageView5 As ImageView
    'Private ImageView6 As ImageView
    'Private ImageView7 As ImageView
    'Public ImageView8 As ImageView
    'Public QRT2 As Byte 
  

End Sub

Sub quartet2 (ImageView8 As ImageView, QRT2 As Byte)

code dans el main:
Sub btnt_Click
    'quartet2
  
    Modul_LEDS.quartet2(QRT2)
  
  
End Sub

Merci d'avance.
 

klaus

Expert
Licensed User
Longtime User
Désolé, mais je ne comprends pas ta question. Que veux-tu faire exactement ?
Tu parles de créer une Class, mais tu utilises un module de code et non un module class, déjà signalé par Erel dans le forum anglais.
Mais pour pouvoir donner une réponse concrète il faut plus d'information sur le but et le pourquoi de cette class.
On pourrait aussi imaginer de créer une CustomView qui est aussi une class.
Expliques en détail ton problème et postes ton projet.

Il y a quelque chose d'incohérent dans tes quelques lignes de code:
Tu as cette routine:
Sub quartet2 (ImageView8 As ImageView, QRT2 As Byte)
Avec deux paramètres.
Mais lorsque tu appelles cette routine, tu ne fournis qu'un paramètre, il manque la ImageView.
Modul_LEDS.quartet2(QRT2)
Pour des CustomViews tu peux te référer au livret B4X CustomViews qui contient des exemples.
 

fgh3966

Active Member
Licensed User
Merci pour ta réponse

Comme je suis débutant en programmation de haut niveau, le programme "main" qui est dans mon cas "progrleds.b4a" (sur mon disque dur) écrit dans un fichier texte va probablement s'allonger et prendre beaucoup de lignes.
Donc je voudrais diviser le programme ou fichier "progrleds.b4a" en plusieurs fichiers plus petits car avec moins de lignes afin de faciliter la lecture et la maintenance/évolution du projet.

Par exemple dans le même répertoire de mon disque dur, il y aurait :

progrleds.b4a qui contiendrait environ 200 lignes de code
+ progr_ram.b4a qui contiendrait 350 lignes de codes
+ progr_relais.b4a qui contiendrais 400 lignes de code.

progrled.b4a étant le fichier principal contiendrait par exemple les #<includes> vers les fichiers progr_ram.b4a et progr_relais.b4a.
Et le compilateur les prendraient en compte.

En résumé : au lieu d'avoir un fichier source de 950 lignes de code, on aurait 3 fichiers avec moins de lignes de code.


Je me souviens vaguement qu'avec d'autres languages on utilisait #<include> et écrivait :
#<include stdio.h>
#<include conio.h>
#<include dos.h>

Sachant que les fichier .h sont des fichiers textes qui pourt le compilateur ont une fonction précise.

Merci de ta compréhension.
 

klaus

Expert
Licensed User
Longtime User
progrled.b4a étant le fichier principal contiendrait par exemple les #<includes> vers les fichiers progr_ram.b4a et progr_relais.b4a.
Ceci n'existe pas dans B4A.
Que fait ton programme progrled.b4a ?
Et quelles fonctions contiennent les autres fichiers ?
Sans connaitre plus en détail ce que ton programme fait, quels genres de fonctions il utilise, quels genres d'affichage il utilise quels genres d'interfaces d'utilisateur, il est impossible de donner un conseil concret.
Selon la composition, le projet peut être séparé en différents fichiers.
Si ton programme a plusieurs écrans, tu peux avoir un fichier par écran.
Si tu as des fonctions particulières, celles-ci peuvent être mises dans un module code ou dans des classes.
Mais, pour pouvoir donner une réponse concrète nous avons besoin de plus d'informations.
Ou, postes ton projet et nous pouvons y jeter un coup d’œil.
 

fgh3966

Active Member
Licensed User
Bonsoir

progrled consiste a décoder une variable de type byte vers 8 images allumées ou 8 autre images éteintes, bref imiter un octet de 8 leds reliées au port d'un microcontrôleur.
Cette partie du programme est avancée et lors de précédent posts sur ce forum en Anglais, on m'a même indiqué une réponse en permettant d'utiliser la récursivité permettant de diminuer fortement le nombre de lignes. C'est vraiment sympa.
Le programme en général consiste à acquérir des données audio qui seront traitées par un dsp, Il faut qu'il permette de visualiser des datas, les filtrer et de les tracer dans un textedit, etc ... Il y a aussi la partie replay, avec des timming bien précis, etc ...
En regardant les possibilités de B4X je vois que je pourrais programmer beaucoup de choses intéressantes, par exemple stocker de fichiers sur clef usb, changer les couleurs d'écran, etc...
Bien entendu je prends mon temps cependant il y a des lignes de codes en perspective. Bref petit à petit :)

Sinon je suis entrain de regarder l'exemple pour les "classes" et de faire des essais à la page 132 du manuel en Anglais.

exemple classe:
'Class Person module
Sub Class_Globals
Private FirstName, LastName As String
Private BirthDate As Long
End Sub
Sub Initialize (aFirstName As String, aLastName As String, aBirthDate As Long)
FirstName = aFirstName
LastName = aLastName
BirthDate = aBirthDate
End Sub
Public Sub GetName As String
Return FirstName & " " & LastName
End Sub
Public Sub GetCurrentAge As Int
Return GetAgeAt(DateTime.Now)
End Sub
Public Sub GetAgeAt(Date As Long) As Int
Private diff As Long
diff = Date - BirthDate
Return Floor(diff / DateTime.TicksPerDay / 365)
End Sub
Main module.
Sub Activity_Create(FirstTime As Boolean)
Private p As Person
p.Initialize("John", "Doe", DateTime.DateParse("05/12/1970"))
Log(p.GetCurrentAge)
End Sub

Merci pour la réponse, bonne soirée.
 

fgh3966

Active Member
Licensed User
Bonsoir

En reprenant l'exemple dessus j'arrive a créer une classe par exemple "decoldeds" je voudrais l'utiliser avec des imageview
j'ai écris le code ci dessous qui s'installe sur le phone hélas lors du clik sur le bouton sur mon phone ça marque :
Sub btnunit_click signature does not match expected signature.
Continue ? yes or not

Il n'y aurait pas un exemple plus simple avec le moins de variable possible ?

decodleds:
Sub Class_Globals
    
End Sub

'Sub Process_Globals
'    'These global variables will be declared once when the application starts.
'    'These variables can be accessed from all modules.
'End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize
    
End Sub

Sub quartet2 (qrt2 As Byte)
    Dim led5,led6,led7,led8 As ImageView

    If qrt2 = 0 Then
        '******************************** 0 *************************************
        led5.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        led6.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
        led7.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        led8.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
    End If

End Sub

appel du main bouton click:
Sub btunit_Click (Deco As decodleds)

    Deco.quartet2(QRT2)
    
End Sub

Merci d'avance.
 
Last edited:

fgh3966

Active Member
Licensed User
Normalement il n'y a que la variable qrt2 a initialiser puisqu'a mon sens les imageview sont constante

J'initialise 1 premiere fois dans la classe routine initialise, puis dans le progr principal dans activitycreate load-layout("main")

j'obtiens tjrs le même message sur mon phone.
 

fgh3966

Active Member
Licensed User
Bonjour

Oui en effet. j'ai des difficultées avec les variables

voici le code main

code main:
#Region  Project Attributes
    #ApplicationLabel: nixie counter
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: portrait
    #CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes
    #FullScreen: true
    #IncludeTitle: false
#End Region

'Activity module
Sub Process_Globals
    Public QRT1 As Byte
'    Public QRT2 As Byte
    Public BV1 As Byte   
    Public BV2 As Byte   
End Sub

Sub Globals
    Private pnl1 As Panel
    Private cvsGraph As Canvas
    Private Label1 As Label
    Private ImageView1 As ImageView   
    Private ImageView2 As ImageView
    Private ImageView3 As ImageView
    Private ImageView4 As ImageView
    Private Lbll6 As Label
    
    End Sub

Sub Activity_Create(FirstTime As Boolean)
        
    Activity.LoadLayout("main")        ' load the layout
    cvsGraph.Initialize(pnl1)    ' initialize the Canvas for the panel
    
    Dim Deco As decodleds
    Deco.initialize(0)   

    pnl1.Invalidate
    'set zeros       
End Sub

Sub quartet1
    
    If QRT1 = 3 Then
        '******************************** 0 *************************************
        ImageView1.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        ImageView2.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        ImageView3.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
        ImageView4.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
    End If
        
    If QRT1 = 1 Then
        '******************************** 1 *************************************
        ImageView1.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        ImageView2.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        ImageView3.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        ImageView4.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
    End If
        
    If QRT1 = 2 Then
        '******************************** 2 *************************************
        ImageView1.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        ImageView2.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        ImageView3.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
        ImageView4.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
    End If


End Sub

Sub btunit_Click (Deco As decodleds) As Byte
    BV1 = BV1 + 1
    QRT1=Bit.And(0x0F,BV1)         
    quartet1
    BV2 = BV1/16
    qrt2 = Bit.And(0x0F, BV2)
    Deco.quartet2(qrt2)
'    Deco.quartet2(QRT2)
'    D.initialise (QRT2)
    
    Lbll6.Text = BV1   
    Label1.Text = "+++"   
End Sub

Sub btdiz_Click   
    BV1 = 0
    QRT1 = 0
'    QRT2 = 0
    quartet1   

    Lbll6.Text = BV1   
    Label1.Text = "ZZERO"       
End Sub

Sub btcent_Click   
    BV1 = BV1 - 1
    QRT1=Bit.And(0x0F,BV1)
    quartet1
    BV2 = BV1/16
'    QRT2 = Bit.And(0x0F, BV2)

    Label1.Text = "---"   
    If BV1 > 15 Then
        Label1.Text = "33ces"
    End If
    Lbll6.Text = BV1
    
End Sub

Sub Activity_Resume
    
End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub


et voici la classe decodleds

classe decodleds:
Sub Class_Globals
    
End Sub

'Sub Process_Globals
'    'These global variables will be declared once when the application starts.
'    'These variables can be accessed from all modules.
'
'    Public QRT2 As Byte
'   
'
'End Sub

'Initializes the object. You can add parameters To this method If needed.
Public Sub Initialize(qrt2 As Byte)
    qrt2 = 0
End Sub

public Sub quartet2(qrt2 As Byte)
    'Dim ImageWiew1, ImageWiev2, ImageWiev3, ImageWiev4)
    Dim led5,led6,led7,led8 As ImageView

    If qrt2 = 0 Then
        '******************************** 0 *************************************
        led5.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        led6.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
        led7.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        led8.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
    End If
    
    If qrt2 = 2 Then
        '******************************** 0 *************************************
        led5.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        led6.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        led7.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
        led8.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
    End If
    
    If qrt2 = 4 Then
        '******************************** 0 *************************************
        led5.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        led6.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
        led7.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        led8.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
    End If

End Sub
 

fgh3966

Active Member
Licensed User
Bonsoir Klaus

C pas possible de rajouter une explication détaillé sur les classes en Français dans votre manuel ?
 

klaus

Expert
Licensed User
Longtime User
J'ai vu que tu as posé la même question dans le forum anglais.
Je n'ai pas répondu avant car j'avais des visites.
Préfères-tu continuer dans le forum français ou dans le forum anglais ?
Il y a plusieurs possibilités, mais il faudrait connaître plus en détail ce que tu veux faire dans la class.
Tu dois transmettre les ImageViews à la class pour qu'elles y soient accessibles.
Tu ne veux vraiment pas poster ton programme test ?
 

fgh3966

Active Member
Licensed User
J'ai vu que tu as posé la même question dans le forum anglais.
Je n'ai pas répondu avant car j'avais des visites.
Préfères-tu continuer dans le forum français ou dans le forum anglais ?
Il y a plusieurs possibilités, mais il faudrait connaître plus en détail ce que tu veux faire dans la class.
Tu dois transmettre les ImageViews à la class pour qu'elles y soient accessibles.
Tu ne veux vraiment pas poster ton programme test ?
 

fgh3966

Active Member
Licensed User
Bonsoir Klaus.
En effet je comprend que vous soyez très occupés, en tout cas merci pour toutes vos réponses ;) c'est vraiment sympa.

Aussi pour expliquer ma demande : La classe, "decodleds" a une variable de 8bit en entrée qui est qrt2 et 4 images en sorties représentant le code binaire.
je simplifie le code en traitant uniquement le quartet de poids faible.
En fonction de la valeur de qrt2 je souhaite afficher un quartet sous forme d'images >> [1 led prendra l'image de leds vertes pour "1"ou led off (grise) pour "0" ] afin de représenter le code binaire sur le téléphone.
Donc ce qu'on peut appeller la sortie de la classe decodleds, bref >> (le return) en langage B4A, c'est l'affichage du quartet sur le téléphone.

Noter que pour simplifier le code je ne traite que quelques valeurs pour le quartet de poid faible donc de 0 a 15.
J'ai sélectionné les valeurs décimales 0, 2 et 4.

Voici le code de la classe decodleds pour lequel je n'arrive pas a initialiser les images.

classe decodleds:
Sub Class_Globals
    Private led5,led6,led7,led8 As ImageView
    'Private qrt2 As Byte  
End Sub

'Sub Process_Globals
'    'These global variables will be declared once when the application starts.
'    'These variables can be accessed from all modules.
'
'    Public QRT2 As Byte
'  
'
'End Sub

'Initializes the object. You can add parameters To this method If needed.
Sub Initialize(qrt2 As Byte, led5,led6,led7,led8 As BitmapDrawable)
    qrt2 = 0
    led5.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
    led6.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
    led7.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
    led8.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
   
End Sub

public Sub quartet2 (qrt2 As Byte)
    'Dim ImageWiew1, ImageWiev2, ImageWiev3, ImageWiev4)
    'Dim led5,led6,led7,led8 As ImageView

    If qrt2 = 0 Then
        '******************************** 0 *************************************
        led5.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        led6.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
        led7.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        led8.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
    End If
   
    If qrt2 = 2 Then
        '******************************** 0 *************************************
        led5.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        led6.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        led7.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
        led8.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
    End If
   
    If qrt2 = 4 Then
        '******************************** 0 *************************************
        led5.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        led6.Bitmap = LoadBitmap(File.DirAssets, "led_vert.png")
        led7.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
        led8.Bitmap = LoadBitmap(File.DirAssets, "led_off.png")
    End If

End Sub

Voici le code du main ou l'octet qrt2 n'est pas reconu

code main:
#Region  Project Attributes
    #ApplicationLabel: nixie counter
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: portrait
    #CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes
    #FullScreen: true
    #IncludeTitle: false
#End Region

'Activity module
Sub Process_Globals
'    Public QRT2 As Byte
    Public BV2 As Byte
    Public qqr As Byte   
End Sub

Sub Globals
    Private pnl1 As Panel
    Private cvsGraph As Canvas
    Private Label1 As Label
    Private Lbll6 As Label
    
    Public Deco As decodleds
    
    End Sub

Sub Activity_Create(FirstTime As Boolean)
        
    Activity.LoadLayout("main")        ' load the layout
    cvsGraph.Initialize(pnl1)    ' initialize the Canvas for the panel
    
' Deco As decodleds
    'Deco.initialize(0, 0)
    
    pnl1.Invalidate
    'set zeros       
End Sub


Sub btunit_Click
    
'    Dim Deco As decodleds
    BV2 = BV2/16
    qrt2 = Bit.And(0xFF, BV2)
    Deco.quartet2(qrt2)
    
    Lbll6.Text = BV2   
    Label1.Text = "+++"   
End Sub

Sub btdiz_Click   
    BV2 = 0
'    QRT2 = 0

    Lbll6.Text = BV2   
    Label1.Text = "ZZERO"       
End Sub

Sub btcent_Click
    
'    QRT2 = Bit.And(0x0F, BV2)

    Label1.Text = "---"   
    If BV2 > 15 Then
        Label1.Text = "33ces"
    End If
    Lbll6.Text = BV2
    
End Sub

Sub Activity_Resume
    
End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub


Concernant le forum c'est comme vous voudrez.
Si j'arrive a utiliser la classe decodleds demain ce serait génial.

Merci d'avance.

Bonne soirée.
 

klaus

Expert
Licensed User
Longtime User
Ci joint un petit projet montrant deux possibilités.
La première, avec une class standard, les ImageViews sont définies dans le module Maint et transférées à la class dans la routine Initialize.
La deuxième, avec une CustomView, les ImageViews sont définies directement dans le module de la CustomView.

Il est dommage que tu n'aies pas posté ton projet test, dès le début, pour faciliter le travail de ceux qui veulent aider concrètement, 'obligeant' ceux-ci à créer eux même ce projet test. Tu aurais obtenu une réponse beaucoup plus rapidement.
 

Attachments

  • TestClass.zip
    17 KB · Views: 62

fgh3966

Active Member
Licensed User
Bonjour Klaus

Finallement je viens juste de comprendre ce que vous me demandez en tant que projet, je suis désolé.
Si j'ai bien compris il fallait le zipper et vous l'envoyer car je pensais qu'en vous envoyant les 2 sources (la classe + le main) cela suffirait.
Je suis désolé de ne pas avoir compris ce que vous me demandiez . Désolé pour le travail supplémentaire 🙄

Un très grand merci.
 

klaus

Expert
Licensed User
Longtime User
Pour zipper un projet, utilises simplement la fonction incluse dans l'éditeur.

1686230293163.png
 

klaus

Expert
Licensed User
Longtime User
car je pensais qu'en vous envoyant les 2 sources (la classe + le main) cela suffirait.
Pour moi, pour aider, je demande presque toujours de voir le projet.
Car on voit ce que le demandeur a fait et comment et ça permet de mieux comprendre le problème et tester la solution.
Dans bien des cas, ça permet aussi, de non seulement répondre à une question mais de résoudre un problème qui ne se situe pas forcément là où le demandeur pensait.
 

fgh3966

Active Member
Licensed User
Bonsoir

J'essaye de n'utiliserque la classe decoLedsClass et l'appli ne se lance pas
 
Top