French classe ou modules cherche documentation ... diminution de la taille du code

fgh3966

Active Member
Licensed User
Bonsoir
il va falloir que je code une app qui prendra quelques pages et je recherche des moyens pour réduire la taille du code et un utilisateur du forum m'a indiqué ce code que je ne comprends pas

B4X:
Sub calc_hexa (in_hexa As Byte) As Char
    Dim out_hexa As Char = "0"    'if in_hexa not valid hex value, then return "?"
    If in_hexa >= 0 And in_hexa <= 15 Then
        out_hexa = "0123456789ABCDEF".CharAt(in_hexa)
    End If
    Return out_hexa
End Sub

Ensuite il y a la boucle "for" pour initialiser des variables au démarrage de l'application, et je cherche de la doc sur les classes et les modules : que peut on faire avec et quelles en sont les limites ?
J'ai regardé dans les booklets fais des recherches sur le forum mais je ne vois pas leurs conditions d'utilisation.
Par exemple est ce que dans le main et dans la classe on peut écrire un texte sur le même label.text ? Et ce que déclarer 2X un widget est faisable ?

Bref tout ce qu'on peut pour pouvoir rédure et organiser son code.

Merci d'avance.
 

Serge Bertet

Active Member
Licensed User
Longtime User
Salut.
Ton bout de code ce serait plutôt ça :

B4X:
Sub calc_hexa (in_hexa As Byte) As Char
    Dim out_hexa As Char = "?"    ' if in_hexa not valid hex value, then return "?"
    If in_hexa >= 0 And in_hexa <= 15 Then
        out_hexa = "0123456789ABCDEF".CharAt(in_hexa) ' retourne le caractère qui se trouve à la position in_hexa dans la chaine
    End If
    Return out_hexa
End Sub

Moi je ferais plutôt ça :
B4X:
Sub calc_hexa (in_hexa As Byte) As Char
    If in_hexa < 0 Or in_hexa > 15 Then return "?" ' if in_hexa not valid hex value, then return "?"
    return "0123456789ABCDEF".CharAt(in_hexa) ' retourne le caractère qui se trouve à la position in_hexa dans la chaine
End Sub

Ou alors, encore plus court :
B4X:
Sub calc_hexa (in_hexa As Byte) As Char
    return IIf(in_hexa < 0 Or in_hexa > 15, "?", "0123456789ABCDEF".CharAt(in_hexa))
End Sub

Pour les classes, oui, c'est un bon moyen de déporter du code de la page vers un autre fichier (et donc alléger le code).
Il y a des limitations effectivement.
Les composants du layout ne sont accessibles par la classe que si le layout est chargé par la classe ou la référence vers le composant passé en paramètre à l'initialisation de la classe.
Idem les événements des ces composants ne seront pas disponibles dans la page si le layout est chargé par la classe (mais on peut les rediriger vers la page)

Choses que je ne sais pas :
Est-ce qu'on peut initialiser une classe dans Main, je ne pense pas, à mon avis ça doit se faire dans une page ou l'initialiser dans le service Starter
Pour les widgets que j'ai jamais utilisé.
 
Last edited:

fgh3966

Active Member
Licensed User
Bonjour Serge, j'ai déjà initialisé un classe dans le main et ça fonctionne bien, par contre je ne me souvenais pas si on pouvais manipuler des widgets avec.
Je vais rechercher de la doc sur les modules mais si je m'en souviens bien : les modules ont une utilisation plus retreinte que les classes.
Concernant les exemples de simplification ou de rapetisser le code, le code que j'avais écris était déjà rapetissé, tu as fais mieux (cool) mais je recherche a savoir comment rapetisser un code par exemple une suite d'instructions ou routines similaires. comment procède t on pour rapetisser du code ?
En tout cas merci de ta réponse.
 

klaus

Expert
Licensed User
Longtime User
mais je recherche a savoir comment rapetisser un code par exemple une suite d'instructions ou routines similaires. comment procède t on pour rapetisser du code ?
Qu'est-ce que tu entends par rapetisser du du code ?
As-tu un exemple de quel genre code tu veux rapetisser ?
 

Serge Bertet

Active Member
Licensed User
Longtime User
Moi je crée une classe d'utilitaires (utils.bas) qui contient des fonctions qu'on utilise souvent (c'est comme une extension du langage).

Par exemple :
B4X:
' suppression récursive du contenu d'un dossier
Public Sub DeleteFolderContent(folder As String)
    ...
End Sub

' Retourne l'extension d'un fichier
Public Sub getFileExt(fic As String) As String
    ...
End Sub

' Supprime l'extension d'un fichier
Public Sub removeFileExt(fic As String) As String
    ...
End Sub

' Decriptage AES
Public Sub AESDecrypt(str As String) As String
    ...
End Sub

' Encriptage AES
Public Sub AESEncrypt(str As String) As String
    ...
End Sub

et dans le code :
B4X:
Private util as utils
util.initialize
util.getFileExt("truc.zip") ' retourne "zip"
 
Last edited:

fgh3966

Active Member
Licensed User
Voici le code original Klaus je met les 2 versions de clac hexa à la suite dans le fichier zip car je n'arrive pas a écrire le code dans la console, ça m'affiche une erreur "oops ....."

Je recherche une ou des méthodes pour réduire des répétitions de codes
 

Attachments

  • reponse_klaus.zip
    649 bytes · Views: 40
  • Capture du 2025-08-01 10-59-50.png
    Capture du 2025-08-01 10-59-50.png
    105.4 KB · Views: 34
Last edited:

Serge Bertet

Active Member
Licensed User
Longtime User
Pour la fonction calc_hexa le problème est résolu il me semble, je pense que @klaus voudrait d'autres exemples de code à réduire.
 

fgh3966

Active Member
Licensed User
Par exemple pour détecter plus de 20 changements de boutons, évidement il y a des variables en jeux. Je vais préciser ça bientôt.
 

fgh3966

Active Member
Licensed User
Bonjour.
Pour reprendre je voudrais faire une app lien_ici regroupant plusieurs fonctions ou activity. Elle serait destinée aux phones et tablettes donc avec les orientations portait et paysages. Je crois que B4Xpage ne me serait pas utile
Qui dit plusieurs fonctions dit pas mal de lignes de code, c'est pour ça que je m'informe sur les modules, les classes et comment réduire la taille du code si besoin.
aussi pour me simplifier la programmation, serait-il possible que SlidingPanels dispose de plusieurs fichiers "activity" liés a leurs "fichier.bal" créés avec le designer.
Après en cherchant sur les forums + ce que vous m'avez indiqué ça devrais aller :)
 

Serge Bertet

Active Member
Licensed User
Longtime User
Réponse rapide, j'ai pas trop creusé. Pour moi 1 panel = 1 classe, le tout déclaré dans Starter.
À la sélection du panel : initialisation de la classe si pas déjà fait.
B4X:
if Not(Initialized(Starter.panelClass)) then
    Starter.panelClass.Initialize(Me, ...) ' chargement du layout et init
End IF
Et la classe gère le contenu du panel.
 
Last edited:

fgh3966

Active Member
Licensed User
Merci
Et donc avec la ClasseDuPanel qu'écrit-on pour lire/écrire et (toutes autre fonctions propres au widgets), le rendre transparent, etc ... ?
Merci
 

Serge Bertet

Active Member
Licensed User
Longtime User
En fait ta classe est comme un module de code.
Dans Sub Class_Globals de la classe tu déclare les composants du layout.
Et dans le corps de la classe les événements correspondant aux composants : bouton_click, panel_touch comme tu le fais habituellement dans le module de code d'une page.
De la même manière, dans les fonctions de la classe tu peux modifier les paramètres des composants comme d'habitude (couleurs, textes, ...).
Je ne vois pas de difficultés particulières si ce n'est pour les widgets (que je ne connais pas) qui nécessitent peut-être des traitements particuliers ?
 
Last edited:

fgh3966

Active Member
Licensed User
dans les souces originales de BetterSlidingPanel il n'y a pas de service starter, dois-je en rajouter un ou je me contenente de rajouter ça dans le main ?
Aussi que veut dire le Me à la ligne Starter.panelClass.Initialize(Me, ...) ?
Désolé ppour mon QI de poisson rouge 😕
 

Serge Bertet

Active Member
Licensed User
Longtime User
BetterSlidingPanel est une librairie (une classe) (je connais pas) ?
Avant d'utiliser la librairie tu dois créer un nouveau projet et c'est là que le service Starter est ajouté automatiquement.
Me correspond au module de code qui appelle la fonction Initialize mais en fait j'ai vérifié et tu es pas obligé de passer ce paramètre Starter.panelClass.Initialize suffit, mais tu peux passer autant de paramètres que tu veux.
Moi je passe souvent Root : Starter.panelClass.Initialize(Root) comme ça la classe peut accéder à la vue principale (Root As B4XView).
 

fgh3966

Active Member
Licensed User
BetterSlidingPanel est un exemple de code fait par les Experts de B4X, j'arrive a comprendre une partie du code, voici les sources originales ci dessous.
Mon projet n'a pas d'orientation spécifiée
Pour l'instant j'ai rajouté 6 fichiers de classes que j'ai initialisé 1 par 1, après je veux bien aller dans Sub class global de chaque fichier classe : classPNL1 à classPNL6 et déclarer les 6 pannels .... ?
Est ce que le Main peut initialiser les 6 panels, et est ce qu'on pourrait les utiliser comme on veut dans classPNL1 à classPNL6 ?
 

Attachments

  • BetterSlidingPanels_ori.zip
    21.1 KB · Views: 31
Last edited:

fgh3966

Active Member
Licensed User
En se basant sur l'exemple TwoActivites : lien à cette discution on peut charger les layout qu'on veut façilement, il suffit d'ajouter le "mécanisme" du slide "glissement" de fenêtre avec le widget des points indiquant où se trouve l'utilisateur.
 

klaus

Expert
Licensed User
Longtime User
Je suppose que ton projet modifié correspond à ce que tu cherches à obtenir.
Il y a 6 Classes, une par page. Les layouts sont chargés dans les classes. Et les évènements des différents objets sont gérés dans les Classes respectives.
 

Attachments

  • BetterSlidingPanels_2.zip
    24.5 KB · Views: 38
Top